PHP をバックエンド処理として使用する場合、長期的な処理を完了する必要があります。この場合、ページ要求に迅速に応答するために、次の措置を講じることができます:
1. FastCGI モードを使用している場合は、fastcgi_finish_request() を使用してセッションを終了できます。ただし、PHP スレッドは実行を続けます。
01
04 07 |
echo "プログラムの開始。" ; file_put_contents ( 'log.txt' , 'start-time:' . date ( 'Y-m-d H:i :s' ), FILE_APPEND); fastcgi_finish_request( ); 'デバッグ...' ; file_put_contents ( 'log.txt' 、 'start-proceed:' . date ( 'Y-m-d H:i:s ' ), FILE_APPEND); sleep(10); file_put_contents ( 'log.txt' , '終了時間:' . 日付 ( 'Y-m-d H:i:s' ), FILE_APPEND);
|
この例の出力結果は、出力プログラムの開始時に確認できます。セッションが戻るため、デバッグ出力ブラウザーはそれを受信できませんが、log.txt ファイルは 3 回の完了を受信できます。 。
2. fsockopen と cUrl のノンブロッキング モードを使用して別の URL をリクエストします
1
2
3
4
5
6
7
8 $fp = fsockopen ( "www .example .com" , 80, $errno , code>$errstr , 30); if (! $fp ) die ( 'error fsockopen ' );
stream_set_blocking( $fp,0); "GET /save.php / HTTP/1.1rn" ; $http .=
"ホスト: www.example.comrn"
$http .= "接続: Closernrn " ; fwrite( $fp , $http );<div class="linenumber8index7alt1">
<code class="php plain">fclose( $fp );
|
1 4 |
3. Gearman および Swoole 拡張機能を使用する
Gearman は、大量の非同期タスクを処理できる PHP 拡張機能を備えた分散非同期処理フレームワークです。
Swoole は最近非常に人気があります。多くの非同期メソッドがあり、使いやすいです。 (Chenyuan 注: PHP を再定義し、NodeJS を完全にスプレーすると主張しています。Swoole ツールは優れていますが、拡張機能自体は NodeJS に匹敵しないように感じます)
4. Redis やその他のキャッシュとキューを使用して書き込みますデータ キャッシュ。バックグラウンドでスケジュールされたタスクを使用してデータの非同期処理を実現します。
このメソッドは、一般的な高トラフィック アーキテクチャでは非常に一般的であるはずです。
5. 極端な場合、システム コマンドが呼び出され、データが実行のためにバックグラウンド タスクに渡される可能性があります。個人的には、そうではないと感じます。非常に効率的です。
1
2
|
$cmd = 'nohup php ./processd.php $someVar >/dev/null &' ; `
$cmd `
|
6. グリンゴの大きな動き、私には理解できません。PHP はネイティブ サポートを備えています
http://nikic.github.io/2012/12/22/Cooperative-multitasking- using-coroutines -in-PHP.html
7. pcntl 拡張機能をインストールし、pcntl_fork を使用してタスクを非同期に実行するためのサブプロセスを生成します。個人的には、これが最も便利だと思いますが、次のような問題が発生する可能性もあります。ゾンビプロセス。
01
05 08 11 15 |
if (( $pid = pcntl_fork()) == 0) { child_func(); php comments">//サブプロセス関数、メインプロセスが実行 } else { father_func(); //メイン処理関数 } getmypid () . " 最後まで進みます。n" ; 関数 father_func() { echo 「父の pid は」 getmypid () . "n" ; child_func() { sleep(6); echo "子プロセスの終了 PID は " getmypid() "n" ; exit (0); } |