PHP ノンブロッキング モード
by Chenyuan on July 31st, 2014 // Filed Under → php
PHP をバックエンド処理として使用する場合、長期的な処理を完了する必要があります。ページリクエストに素早く応答するために、結果返還判定は行われません:
1. FastCGI モードを使用している場合、fastcgi_finish_request() を使用するとセッションを即時に終了できますが、PHP はセッションを終了します。スレッドは実行を続けます。
ヘルプ
01 02 03 04 05 06 07 08 09 10 |
echo "プログラム開始。"; file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND); fastcgi_finish_request() echo 'デバッグ...'; file_put_contents('log.txt','start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND); file_put_contents('log.txt','end-time:'.date('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,$errstr, 30); if(!$fp)die('error fsockopen'); stream_set_blocking($) fp, 0); $http="GET /save.php / HTTP/1.1rn"; $http.="ホスト: www.example.comrn"; ; fwrite($fp,$http) cURL でcurl_multi_* 関数を使用して非同期リクエストを送信する
ヘルプ 1 2 3 4 5 6 |
$cmh=curl_multi_init() ; $ch1=curl_init(); curl_setopt($ch1, CURLOPT_URL,"http://localhost:6666/child.php"); cmh,$active); echo "Endn"; | 3. Gearman、Swoole 拡張機能を使用する Gearman は、大量の非同期タスクを処理できる分散非同期処理フレームワークです。 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(); //サブプロセス関数、メインプロセスが実行されます ; }その他{ Father_func(); //メイン処理関数 } echo "「.getmypid() ." を最後まで処理する。n」 functionfather_func() { echo" ".getmypid() ."n"; } functionchild_func() { sleep(6); echo"子プロセスの終了 pid は ".getmypid() ."n"; exit (0); } |
|
|