ホームページ  >  記事  >  バックエンド開発  >  PHP ノンブロッキング モード (Chenyuan からリダイレクト)

PHP ノンブロッキング モード (Chenyuan からリダイレクト)

WBOY
WBOYオリジナル
2016-06-13 12:28:45853ブラウズ

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

PHP をバックエンド処理として使用する場合、長期的な処理を完了する必要があります。この場合、ページ要求に迅速に応答するために、次の措置を講じることができます:

1. FastCGI モードを使用している場合は、fastcgi_finish_request() を使用してセッションを終了できます。ただし、PHP スレッドは実行を続けます。

ヘルプ
01
01
02
03
04
05
06
07
08
09
10
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);
0203
040506
07080910
echo "プログラムの開始。" ;
file_put_contents('log.txt','start-time:'.date('Y-m-d H:i :s'), FILE_APPEND);
fastcgi_finish_request( );
sleep(1);<div class="linenumber6index5alt1 "> <code class="php function">echo 'デバッグ...';
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
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 .= "Host: www.example.comrn";   
$http .= "Connection: Closernrn";
fwrite($fp,$http);
fclose($fp);
2
3
4

5
6

7
8
$fp = fsockopen("www .example .com", 80, $errno, code>$errstr, 30);
if (!$fp) die('error fsockopen ');
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";
stream_set_blocking($fp,0);
$http <code class="php plain">= "GET /save.php / HTTP/1.1rn";
$http .= "ホスト: www.example.comrn"
$http .= "接続: Closernrn ";
fwrite($fp,$http);<div class="linenumber8index7alt1"> <code class="php plain">fclose($fp);
curl_multi_ を使用する* cURL の関数 非同期リクエストの送信ヘルプ
$cmh =curl_multi_init() ;
$ch1 =curl_init( ); code><div class="linenumber3 index2 alt2"> <code class="php plain">curl_setopt($ch1 、CURLOPT_URL、"http://localhost:6666/child.php");<div class="linenumber4index3alt1"> <code class="php plain">curl_multi_add_handle($cmh, $ch1);
curl_multi_exec($cmh, $active);
echo "Endn";
123
456

3. Gearman および Swoole 拡張機能を使用する
Gearman は、大量の非同期タスクを処理できる PHP 拡張機能を備えた分散非同期処理フレームワークです。
Swoole は最近非常に人気があります。多くの非同期メソッドがあり、使いやすいです。 (Chenyuan 注: PHP を再定義し、NodeJS を完全にスプレーすると主張しています。Swoole ツールは優れていますが、拡張機能自体は NodeJS に匹敵しないように感じます)

4. Redis やその他のキャッシュとキューを使用して書き込みますデータ キャッシュ。バックグラウンドでスケジュールされたタスクを使用してデータの非同期処理を実現します。
このメソッドは、一般的な高トラフィック アーキテクチャでは非常に一般的であるはずです。

5. 極端な場合、システム コマンドが呼び出され、データが実行のためにバックグラウンド タスクに渡される可能性があります。個人的には、そうではないと感じます。非常に効率的です。

ヘルプ
1
1
2
$cmd = 'nohup php ./processd.php $someVar >/dev/null  &';
`$cmd`
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
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);
}
020304
05
0607
080910
11121314
151617
if (($pid = pcntl_fork()) == 0) {
child_func(); php comments">//サブプロセス関数、メインプロセスが実行
} else {
father_func(); //メイン処理関数
}
echo <code class="php string">「プロセス」 getmypid() . " 最後まで進みます。n";
関数 father_func() {
echo 「父の pid は」 getmypid() . "n";
}<div class="linenumber12index11alt1"> <div class="linenumber13index12alt2"> <code class="php キーワード">function child_func() {
sleep(6);
echo "子プロセスの終了 PID は " getmypid() "n";
exit (0);
}
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。