share facebook facebook2 twitter menu hatena pocket slack

2016.06.20 MON

[雑記] PHPカンファレンス福岡2016 #phpconfuk

小谷松 丈樹

WRITTEN BY小谷松 丈樹

PHPカンファレンス福岡2016

PHPカンファレンス福岡2016に参加してきました。
がっつりメモを取れたものだけまとめを書いていきます。

もう確認した?『PHPカンファレンス福岡2016』全スライドまとめ #phpconfuk

制約でコードに秩序を

制約とは

  • アクセス修飾子
  • タイプヒンディング
  • インターフェイス
  • 不変オブジェクト
case1 カートに商品を追加
  • タイプヒンディング
    • public function(Item $item)
    • 引数に入力するオブジェクトにItemクラスしか受け付けない
case2 不変オブジェクト
  • コンストラクタで設定したら関数で値を返すようにする
  • 再設定ができなくなるので料金を書き換えるバグを抑止できる
  • 消費税の加算計算などはオブジェクト内部で保持してコード保全
case3 インターフェイス
  • JSONでオブジェクトを返す
    • 共通関数にしたいがItemクラスもCartクラスも受け付けたい
  • Interface
    • ItemクラスにもCartクラスにも同じ属性を持たせることができる

まとめ

  • 自由を奪う面倒なものではなくコードに秩序をもたらすもの
  • かっこいいコード書きたいんだったらPHP7
  • protected と privateをどうやって使い分けるか
    • まずはprivate/必要ならprotected
    • いつか呼ばれるかもしれないからprotected
      • You ain’t gonna need it
    • 他人が作ったシステムをメンテナンスするとprivate万歳
    • traitがあるので、機能のために継承する必要がない

Guzzle Promiseを使った
非同期処理によるAPIコールの高速化

Guzzleってどういう意味

  • 大酒を飲む、ガツガツ食べる
    • 大規模処理に向いている?

使い方

  • Clientを作ってリクエストを投げる
    • $client->request(‘get’,’http://localhost/’)
    • $client->get(‘http://localhost/’) などの省略も可能
    • post,delete,putなどのメソッドもサポートされている

非同期リクエスト

  • $client->getAsync(‘http://localhost/’)
    • 書き換えるだけでいけると思ったらダメだった
    • Promiseオブジェクトを返す
  • PromiseといえばJavaScript
    • JavaScript Promiseの本
    • 非同期処理を抽象化したオブジェクト
      • 非同期処理の実行, resolve, reject

Guzzle Promise

  • Promiseオブジェクトが返ってくる
    • メソッドチェーン
    • 成功時と失敗時のメソッドチェーンをつなげる

大量にリクエストする場合

  • ループでPromiseオブジェクト配列にぶちこむんで一気に非同期リクエスト
    • promiseオブジェクトはメモリを食う
    • 一気に捌くには大量のメモリが必要
    • Generator, Yield

Pool

  • Poolオブジェクト
    • concurrency 同時実行数
    • fulfilled リクエスト成功時に実行する関数
    • rejected リクエスト失敗時に実行する関数
  • concurrencyで同時リクエスト数を増やしてその分を一気に投げる
    • 速いしメモリも問題ない

質疑

  • concurrencyの値をいくつくらいに設定するべきか
    • 受け側のサーバ性能によるところもあるので実際に少しずつ調整すると良い

CakePHP3に乗り換えよう

  • http://qiita.com/kozo でCakePHPの情報をゲット

cake2→3に移行するメリット

  • クエリビルダ
    • オブジェクト化されてメソッドチェーンでクエリをかける
  • さらにクエリビルダ
    • 複雑なSQLをかける
      • matching inner_join
      • where句にサブクエリもかける
  • table, entity
    • 今までのmodelクラスが2つに
    • TableはDBへのアクセス
    • EntityがDBの1レコードをさす
  • html修正が楽
  • namespaceに対応した
    • 大規模開発向けにさらに良くなった

おすすめプラグイン

  • fusic/Apollon
    • 基本的なバリデーションルールをまとめているValidationクラス
    • composer require fusic/Apollon
  • fusic/encount
    • 本番環境でfatelエラーなどがおきたらメールなどで通知してくれる
    • Senderクラスを自作すればSlackなどに投げられる
    • composer require fusic/encount
  • kozo/Partial
    • 同一コントローラ内で使える小さいスコープのテンプレート
    • 共通する部分を別ファイルにする
      • 新規登録、編集画面などで共通にできる

クエリビルダのススメ

クエリビルダとは

  • SQLを組み上げるもの
  • Illuminate/Databases
SELECT name,price
FROM books
WHERE name like '%PHP%'
ORDER BY price desc
LIMIT 10

$builder->table('books')
    ->where('name','like','PHP')
    ->orderby('price','desc')
    ->take(10)
    ->select('name','price');

メリット

  • 書きやすい
  • SQLインジェクションなどが対策できる
  • データとクエリが分けられるので読みやすい
  • 再利用性

insertがいいぞ

  • バルクインサートに勝手に書き換えてくれる

PHPデベロッパーのためのJavaScriptセキュリティ入門

  • なぜJSの話か
    • ブラウザ・JavaScriptの処理の高速化
    • JSが扱うデータが増加し、脆弱性も比例して増加
    • フロントエンドのセキュリティも大事

フロントエンドのセキュリティ問題

  • 受動的攻撃が多くなってる
  • 攻撃側は新しいweb技術を最も活用できる
  • 最低限のセキュリティ対策

脆弱性とは

  • 機能や性能を損なう原因となりうる安全性上の問題箇所 etc
  • 脆弱性はバグの一種。本来できてはいけないことをできるようにしてしまうバグ
    • まずはプログラムの品質をあげよう

JSのセキュリティ

JSによるオープンリダイレクタ
  • 任意のサイトにリダイレクとされてしまう
  • いつの間にかフィッシングサイトなどに飛んでしまう
  • 対策
    • 固定オブジェクトとして繊維先を保存しておく
    • 自サイトのドメインを毎度指定する
DOM-based XSS
  • ソースとシンク
  • シンクとなるDocument.innerHTMLやlocation.hrefなどは使わない
  • 固定値リストをちゃんと使ってね

PHPから離れて感じるPHPの良さ

Composer

  • Pythonではpip
  • 依存性の解決が素晴らしい
  • 光の速さで遅い

PHPは優秀なライブラリが多い

  • Carbon
  • SwiftMailer
  • Monolog
  • Guzzle
  • SymfonyComponents

PHPから離れて

  • PHP依存の悪循環
  • 結局離れられていない

LTで気になったもの

swaggerでかっこいい APIドキュメントを作ろう

  • APIの定義をドキュメントブロックに書く
  • API定義情報のリストをjsonで吐き出せる
  • パラメータを指定してリクエスト結果などを確認できるAPIドキュメントページが出来る

まとめ

以上です。
初めてPHPカンファレンスに参加しましたが、かなり勉強になりました。
また行きたいなー

元記事はこちら

[雑記] PHPカンファレンス福岡2016 #phpconfuk

小谷松 丈樹

小谷松 丈樹

アイレット第一事業部のWebアプリ開発者。PHP、JavaScriptの案件がメイン。モノづくりは常に楽しみながらがモットー。面白いものを生み出して、管理までできるようになるのが目標。