ノンブロッキング モードは、サーバーとクライアント間の通信が非同期状態にあるメッセージング メカニズムを指します。興味のある方はぜひこのページをご覧ください。お役に立てれば幸いです。
PHP がバックエンドプロセスとして長期的な処理を完了する必要がある場合、結果の戻りを判断せずにページリクエストに迅速に応答するために、次の措置を講じることができます。
1. FastCGI モードを使用する場合、fastcgi_finish_request() を使用するとセッションはすぐに終了しますが、PHP スレッドは実行を続けます。
echo "program start."; file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND); fastcgi_finish_request(); sleep(1); echo 'debug...'; file_put_contents('log.txt', 'start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND); sleep(10); file_put_contents('log.txt', 'end-time:'.date('Y-m-d H:i:s'), FILE_APPEND);この例の出力結果は、出力プログラムの開始で確認できます。セッションが戻るため、デバッグ出力ブラウザーはそれを受け取ることができず、log.txt ファイルは 3 つの完了時間を完全に受け取ることができます。 。
2. fsockopen と cUrl のノンブロッキング モードを使用して別の URL をリクエストします
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) die('error fsockopen'); stream_set_blocking($fp,0); $http = "GET /save.php / HTTP/1.1\r\n"; $http .= "Host: www.example.com\r\n"; $http .= "Connection: Close\r\n\r\n"; fwrite($fp,$http); fclose($fp);cURL でcurl_multi_* 関数を使用して非同期リクエストを送信します
$cmh = curl_multi_init(); $ch1 = curl_init(); curl_setopt($ch1, CURLOPT_URL, "http://localhost:6666/child.php"); curl_multi_add_handle($cmh, $ch1); curl_multi_exec($cmh, $active); echo "End\n";
3. Gearman 、Swoole 拡張機能を使用します
Gearman は、PHP 拡張機能を備えた分散非同期処理フレームワークであり、非同期タスクの大規模なバッチを処理できます。 Swoole は最近非常に人気があり、多くの非同期メソッドがあり、使いやすいです。 (Chenyuan からのメモ: PHP を再定義し、NodeJS を完全にスプレーすると主張しています。Swoole ツールは優れていますが、拡張機能自体は NodeJS に匹敵しないように感じます)
4. Redis やその他のキャッシュとキューを使用して書き込みますデータをキャッシュに保存するには、バックグラウンドでスケジュールされたタスクを使用してデータの非同期処理を実装します。
この方法は、一般的な高トラフィックのアーキテクチャでは非常に一般的であるはずです5. 極端な場合には、システムコマンドが呼び出され、データが実行のためにバックグラウンドタスクに渡される可能性がありますが、個人的にはそうではないと感じています。非常に効率的です。
$cmd = 'nohup php ./processd.php $someVar >/dev/null &'; `$cmd`
6. グリンゴの大きな動き、PHPネイティブサポートが理解できません
7. pcntl 拡張機能をインストールし、pcntl_fork を使用してタスクを非同期に実行するサブプロセスを生成すると、個人的にはこれが最も便利だと思いますが、問題が発生する可能性もあります。ゾンビプロセス。
if (($pid = pcntl_fork()) == 0) { child_func(); //子进程函数,主进程运行 } else { father_func(); //主进程函数 } echo "Process " . getmypid() . " get to the end.\n"; function father_func() { echo "Father pid is " . getmypid() . "\n"; } function child_func() { sleep(6); echo "Child process exit pid is " . getmypid() . "\n"; exit(0); }
関連する推奨事項:
phpはswooleを使用してクライアントデータをリアルタイムで更新します
Swooleを使用してWebページを非同期にクロールする実用的な共有
php CGI 、FastCGI、APACHE2HANDLER、CLI動作モードの詳細説明
以上がPHPノンブロッキングモードの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。