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);
|
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.1rn" ;
$http .= "Host: www.example.comrn" ;
$http .= "Connection: Closernrn" ;
fwrite( $fp , $http );
fclose( $fp );
|
1 2 3 4 5 6 |
$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 "Endn" ;
|
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 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 |
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);
}
|