ホームページ  >  記事  >  バックエンド開発  >  PHP ノンブロッキング モード

PHP ノンブロッキング モード

WBOY
WBOYオリジナル
2016-06-23 13:39:21954ブラウズ

PHP ノンブロッキング モード

by Chenyuan on July 31st, 2014 // Filed Under → php

PHP をバックエンド処理として使用する場合、長期的な処理を完了する必要があります。ページリクエストに素早く応答するために、結果返還判定は行われません:

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

ヘルプ

2

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
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_* 関数を使用して非同期リクエストを送信する

ヘルプ

3. Gearman、Swoole 拡張機能を使用する

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";

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);

}

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。