ホームページ  >  記事  >  バックエンド開発  >  PHP ノンブロッキング モード (Chenyuan から転載)、phpchengyuan_PHP チュートリアル

PHP ノンブロッキング モード (Chenyuan から転載)、phpchengyuan_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:58:04771ブラウズ

PHP ノンブロッキング モード (Chenyuan からの転載)、phpchengyuan

PHP がバックエンドプロセスとして長時間の処理を完了する必要がある場合、結果の戻りを判断せずにページリクエストに迅速に応答するために、次の措置を講じることができます。

1. FastCGI モードを使用している場合、fastcgi_finish_request() を使用するとセッションがすぐに終了しますが、PHP スレッドは実行を継続します。

ヘルプ

01 02 03 04 05 06 07 08 09 10 この例の出力では、出力プログラムの開始後にセッションが戻ることがわかります。そのため、デバッグ出力ブラウザーはセッションを受信できませんが、log.txt ファイルは 3 つの完了時間を完全に受信できます。
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 をリクエストします

ヘルプ

1 2 3 4 5 6 7 8

cURL でcurl_multi_* 関数を使用して非同期リクエストを送信します

ヘルプ
$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); }

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1104657.html技術記事 PHP 非ブロック モード (Chenyuan から再投稿) では、PHP がバックエンド処理として使用される場合、ページ リクエストに迅速に応答するために、PHP がブロックされなくなります。結果返却判定が行われます…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。