PEARのライブラリ
PHPを使ってる人には馴染み深い存在であるPEARライブラリ。今回は、その中のHTTP_Requestクラスの不具合と、その修正方法について記述します。
このHTTP_Requestクラスには、通常環境であればほぼ問題にならないようなある不具合が存在しています。その不具合とは、HTTPリクエストにたいする応答ヘッダーに記述されている「Content-Length」に対応していないという不具合です。
では、何でContent(内容)の受信を終了する判定になっているかというとSocketクラスのバッファ状態がEOFになるまで繰り返すという処理になってます。具体的なコードを書くことはできませんが、このあたりはソースを追っかけたら即分かると思います。
さて、この問題は一般的に使われているHTTPサーバーであれば、ほぼ問題は発生しないのですが、HTTPサーバーの仕様によっては、受信処理がネットワークタイムアウトまで終了しないという問題が発生してしまいます。
この問題を解決するには、Content-Length分だけ受信するようにすれば良いだけなので、修正自体はとても簡単です。
というか、なんでこんなところサボってるのか謎です。
以前、PEARのDBクラスでMySQLのSelectDBがクエリーを送信するたびに実行されてる件について調査したときも、クエリー実行時に必ずSelectDBするコードが紛れ込んでて辟易したのですが、今回も同じぐらい辟易しました。
というわけで、PEARライブラリ自体はとても有用なライブラリ群であるけれども、更に活用していくためには、せっかくのソース付きライブラリ(というか、ソース自体がライブラリ)なので気に入らない部分は自分で修正しちゃいましょうという話でした。


Recent Comments