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