HTTPメッセージ、PHPの 事情ば分かっとっと?

1,215 views

Published on

第102回 PHP勉強会@東京 でのスライドです
https://phpstudy.doorkeeper.jp/events/44793

Published in: Internet
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,215
On SlideShare
0
From Embeds
0
Number of Embeds
463
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

HTTPメッセージ、PHPの 事情ば分かっとっと?

  1. 1. HTTPメッセージ、PHPの 事情ば分かっとっと? 第102回 PHP勉強会@東京 @sasezaki 『開発者は、ウェブアプリケーションを構築する際に HTTPメッセージとどう対峙していけばいいのだろ う?そのためには、SAPI・ストリーム・出力バッファ リングと向きあなわければいけないのでは?』が今日 のテーマです。 2016.05.25
  2. 2. ● 自己紹介 ここ数年の記事とか発表 – 2015年03月 日記 PHP -憂鬱な希望としての PSR-7 http://sasezaki.hatenablog.com/entry/2015/03/07/195908 – 2015年06月 Symfony Meetup Symfony ユーザ向け psr-7 zend-diactoros Middleware 入門 http://psr7.net/sasezaki/slide20150620/ – 2015年06月 動作確認 ストリーム 関連のプロジェクトの話 https://gistlog.co/sasezaki/fb703148b0542d61f0bb – 2015年11月 PHP勉強会@相模原 PSR-7 -これは何だ http://psr7.net/sasezaki/slide20151110/
  3. 3. ● 自己紹介 ここ数年の記事とか発表 – 2016年05月 PHPカンファレンス福岡2016 HTTPメッセージ - PHPで扱う場合の再入門 http://psr7.net/sasezaki/phpconfuk2016/ NEW ・・・ということで、 察しがついたかも知れませんが、今日の話は 先日の発表をベースにしてます。
  4. 4. https://twitter.com/chobi_e/status/193717178615345153
  5. 5. せやな(汗 ...........SAPIって何?
  6. 6. 「PHPの実行環境は、主にWebサーバ(でのモジュール)」 「サーバにはapache以外にも色々ある。」 「CLIもサーバ」 『第1回 身近なWeb[PDF] – 放送大学』より http://morimoto.code.ouj.ac.jp/resources/2015_web/01.pdf
  7. 7. 図コピペ元:http://tech.respect-pal.jp/php-helloworld/
  8. 8. サーバーリクエスト (Incoming Request ) Webサーバ HTTPリクエスト PHP スクリプトコード ・ $_SERVER,$_GET,$_POST,$_COOKIE,$_FILES ・ apache_request_headers() ・ php://input apache_request_headers()が必要な場面について “In particular, it SHOULD removeany header fields carrying authentication information, such as 'Authorization'; or that are available to the script in other variables, “  (RFC 3875より)
  9. 9. 最大サイズ・最大長などの制限を設けてる ● HashDosで知られるmax_input_varsの導入はPHP 5.3.9から ● もちろん、サーバソフト側でも制限設定項目はあり ● ApacheのLimitRequestBody ディレクティブなど POSTメソッドでの場合の$_POSTへの変換 ● sapi_activateでのsapi_read_post_dataのコールにて取得 php-src/main/SAPI.c 参照 ● php.ini のenable_post_data_reading にて$_POST や $_FILESへ の格納を無効化可能 (PHP 5.4より) サーバーリクエストからのスーパーグローバルへ
  10. 10. 『今の若い人は CGI なんか知らないと思いますが、そ ういうのがあって、昔はとてもよく使われてたんです よ。この CGI の仕様を借りて WSGI が Environment の 仕様を決め、Rack もそれを継承しています。そのた め、CGI を知らない人から見ると奇妙な仕様に見えるで しょう。「なんで User-Agent ヘッダーが HTTP_USER_AGENT に変わってるの?そのまま User- Agent 文字列を使えばいいのに。」のような感想が出て きそうです。』 $_SERVER, CGI, Environment(wsgi, rack) http://qiita.com/kwatch/items/67657fef43666479bb99
  11. 11. ※ ちなみに、PHPにおける”リアル”とは
  12. 12. PHPのひょうじゅんAPI つらぽよ
  13. 13. E_WARNING: Cannot modify header information - headers already sent by (output started at ...
  14. 14. スーパーグローバルを直に触るのはつらい header()を先に呼ばなきゃいけないのがつらい ファイル配列操作がつらい リクエストURIの操作がつらい 『PSR-7: HTTP Message Meta Document』から意訳&抜粋
  15. 15. アプリケーション実装者が行いたいことは、 リクエストを受け取って、レスポンスを生成する
  16. 16. function dispatch($request,$response);
  17. 17. HTTP リクエスト ディスパッチャ ( index.php ) ブートストラップ コントローラ ルーティング リクエスト レスポンス View / テンプレート リクエストルーター利用でのプロジェクト構成(例)
  18. 18. かくして、PHP開発者はHTTP メッセージと末永く暮らしていき ましたとさ。 めでたし。めでた.....
  19. 19. Fatal error: Allowed memory size of 6291456 bytes exhausted (tried to allocate 2097153 bytes) ひー
  20. 20. PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは
  21. 21. メッセージボディは、 文字列で決定やな。 * * @return string */ public function getContent() { HTTPメッセージコンポーネント設計者 ・・・なんや問題あるんか?
  22. 22. 何が問題?   メモリを制限なく消費する可能性 → ヘッダやボディに最大長についてRFC規定あっただろうか? 例えばApacheの場合、LimitRequestBodyにて許可バイト数設定 開発者は諦めてアクションでecho → getContent()にてコールバックを許容した場合、  戻り値の方が一致しない Streamリソース利用の発想が抜けている → HTTPクライアントとして、ストリームは利用しているのに...
  23. 23. レスポンスボディの出力・フラッシュ 標準の設定では、echoがあれば直ちに送信や文字列すべてを出力 はしない パフォーマンスのためにデフォルトのphp.iniでは output_buffering = 4096に設定されている。※ CLIは除く ob_start() コールバック関数 ob_start() での引数、またはphp.iniでのoutput_handlerの指定 により、出力バッファの内容を操作できる。 ob_gzhandler()関数など テンプレートエンジン / Viewレンダラーでの応用 出力内容を文字列として取得するために、ob_start() ob_get_contents()を行っている。 ここでもメモリ使用量増大の可能性 出力出力バッファリング制御制御
  24. 24. せや、streamや! * * @return stream */ public function getContent() { HTTPメッセージコンポーネント設計者
  25. 25. 抽象化 I/O PHP 4.3から登場したresourceオブジェクト 普段のファイルシステムやhttpなどのスキーマは、デフォルトの ラッパーにすぎない 入出力ストリーム php://temp により、メモリならびにテンポラリファイルへの読 み書きが行える ストリームフィルタ ストリームはカスタムフィルタを作成し、登録できる PHPPHPにおにおけるStreamStream
  26. 26. レスポンス作成時の例外・エラー処理レスポンス作成時の例外・エラー処理  ストリームや出力バッファリング制御 の利用によ り、メモリ利用量を抑えレスポンス出力時に処理を 実行することは可能でしょう。  ただし、レスポンスボディ作成時の例外(DBコネク ションエラーなど)などを考慮すると一度テンポラリーに 書き出しておき、そのストリームリソースを再度渡 すなどの対応も考慮すべきでは。
  27. 27. HTTPメッセージ コンポーネントが おおすぎる
  28. 28. • CakeNetwork{Request,Response} • CI_Input, CI_Output • NetteHttp{Request,Response} • PHPixieHTTP{Request,Responses} • SymfonyComponentHttpFoundation{Request,Response} • yiiweb{Request,Response} • ZendHttp{Request,Response} Rob Allen 『HTTP, PSR-7 and Middleware』から
  29. 29. 依存を抑え、 リクエスト・レスポンスを扱う処理 を相互運用するには?
  30. 30. HTTP レスポンス ディスパッチャ ブートストラップ コントローラ ルーティング リクエスト レスポンス View / テンプレート Debugツールバー Authentication ミドルウェア・ ランナー MiddlewareMiddleware Middleware Middleware ミドルウェア利用でのプロジェクト構成例 while (! $stream->eof()) { echo $stream->read(8192); }
  31. 31. リクエストを受け取って、レスポンスを合成し、 次の処理へ渡す
  32. 32. function __invoke( ServerRequestInterface $request, ResponseInterface $response, callable $next);
  33. 33. psr-7はHTTPメッセージの値についてのinterfaceを定 義している 従来のレスポンスクラスでは、send()メソッドなんて用意していた サーバーリクエストには、アプリケーションでの相互 運用のために attributesプロパティが用意されている ミドルウェアシグネチャでの議論・検討の余地 従来のEventManagerを利用したプラグインとの使い分けは? HTTPクライアントでのミドルウェアはどうあるべきか? インターフェイスなどにて別途psrを定義すべきでは? PSR-7 とミドルウェア
  34. 34. PSR-7PSR-7 に対するご意見に対するご意見
  35. 35. ● PHPカンファレンス福岡2016で出た質問・余談 – Q「ストリームだと、今までの文字列関数を利用した フィルタリングに比べて大変では?」 ● 私見「レスポンスボディ全体を文字列置換?(困惑)」(“エン コード”の範囲なら、今までのstream filterの想定範囲と同様 に効力あるかと)
  36. 36. ● PHPカンファレンス福岡2016で出た質問・余談 – Q「echo に比べてストリーム大変ですよ。。」 これを
  37. 37. ● PHPカンファレンス福岡2016で出た質問・余談 – Q「echo に比べてストリーム大変ですよ。。」 こうしたり
  38. 38. ● PHPカンファレンス福岡2016で出た質問・余談 – Q「echo に比べてストリーム大変ですよ。。」 こうじゃ!
  39. 39. ● PHPカンファレンス福岡2016で出た質問・余談 – Q「PSR-7だと今のPHP組み込みのセッション機構と 整合性がないのでは?」 ● 私見「Cookieを利用したセッションということで?本発表で述 べたように、PHPはHTTPメッセージ解釈機能を併せ持ってこ そツールとしての価値があるのです。私は、それを崩そうとは 思いません。従来の($_SESSIONをラップした)セッションコン ポーネント使います。」 (本音「そこまで、深く考えてなかったンゴwww」 今までのHTTPメッセージコンポーネントでも同様の問題で は。。) ※ 「PSR-7 and Session Cookies」http://paul-m-jones.com/archives/6310 と いう記事にセッションのクッキーヘッダーへのハック周りについて記載がありま す。
  40. 40. おわりです ご清聴ありがとうございました
  41. 41. イラスト素材 ● http://www.wanpug.com/ ● http://hiyokoyarou.com/
  42. 42. 参考文献 ● php と sapi と zendengine2 と.. http://www.slideshare.net/do_aki/php-and-sapi-and-zendengine2-and ● PHP による hello world入門 http://tech.respect-pal.jp/php-helloworld/ ● PHP output buffer in deep http://jpauli.github.io/2014/12/19/php-output-buffer-in-deep.html ● PSR-7: HTTP message interfaces http://www.php-fig.org/psr/psr-7/ ● PSR-7: HTTP Message Meta Document http://www.php-fig.org/psr/psr-7/meta/ ● A Case for Higher Level PHP Streams in PSR-7 http://mtdowling.com/blog/2014/07/03/a-case-for-higher-level-php-streams/

×