ホームページ  >  記事  >  バックエンド開発  >  PHP 用の HTTP 解析拡張機能: php_http_parser

PHP 用の HTTP 解析拡張機能: php_http_parser

WBOY
WBOYオリジナル
2016-06-23 13:22:221126ブラウズ

php_http_parser は、node.js http-parser に基づく PHP 拡張機能であり、純粋に非同期の PHP プログラムを実装するために使用できます

libcurl は、2 つのスタイルの非同期呼び出しメソッドを提供します:

  • 1 つのマルチハンドル、多数の簡単な操作ハンドル: 複数の簡易ハンドルを追加した後、curl_multi_perform メソッドを実行します。このメソッドには、PHP CURL 拡張機能に対応する実装があります。ただし、最後のステップcurl_multi_performがブロックされています。

  • MULTI_SOCKET、これは本当にノンブロッキングなメソッドですが、イベントループを自分で実装する必要があり、カプセル化が難しいのが現状です。調査の結果、curl_multi_socket_action を PHP カーネルと統合するのは非常に困難であることがわかりました。

それ以外には、基本的に、非同期 http リクエストを実装する実際の php 拡張機能はありません。現在、純粋な PHP で実装されているバージョンは、tsf での http クライアント実装など、一部のバージョンのみです。純粋な PHP を使用する場合の問題は、主に http 解析のパフォーマンスによって制限されます。したがって、このモジュールを拡張された方法で実装することを検討してください。 node.js http-parser は、C 言語の優れた http 解析ライブラリです。 php_http_parser はそれをカプセル化したもので、対応するインターフェイスを php で公開します。

真のノンブロッキングリクエストを実現するには、やはりイベントループを自分で実装する必要があります。パフォーマンスを向上させるために、現時点では swoole と組み合わせて使用​​することをお勧めします。

使い方

$buffs = array("HTTP/1.1 301 Moved Permanently\r\n","Location: http://www.google.com/\r\n","Content-Type: text/html; charset=UTF-8\r\n","Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n","Expires: Tue, 26 May 2009 11:11:49 GMT\r\n","Cache-Control: public, max-age=2592000\r\n","Server: gws\r\n","Content-Length: 193\r\n","\r\n","<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n","<TITLE>301 Moved</TITLE></HEAD><BODY>\n","<H1>301 Moved</H1>\n","The document has moved\n","<A HREF=\"http://www.google.com/\">here</A>.\r\n"    ,"<A HREF=\"http://www.google.com/\">here</A>.\r\n"    ,"<A HREF=\"http://www.google.com/\">here</A>.\r\n"    ,"<A HREF=\"http://www.google.com/\">here</A>.\r\n"    ,"<A HREF=\"http://www.google.com/\">here</A>.\r\n","</BODY></HTML>\r\n");$hp = new HttpParser();foreach($buffs as $buff){    $ret = $hp->execute($buff);    if($ret !== false){        echo $ret;        break;    }}

http リクエストは別々のパッケージで送信される場合がありますが、HttpParser はすべてのパッケージをマージし、body イベントをトリガーして、対応するコールバック メソッドを呼び出します。ヘッダー コールバックなど、現在は実装されていません。さらに、ここでタイムアウト ロジックを自分で実装する必要があります。

サンプルコードは、swoole_clientとswPromiseフレームワークを組み合わせて実装された非同期httpクライアントです。このようにして、真にノンブロッキングの PHP プログラムを実現できます。

すごい

プロジェクトのホームページ: http://www.open-open.com/lib/view/home/1448201436622

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。