PHP非ブロックモード
4622 ワード
PHPをブロックしないようにするPHPをバックエンド処理として長時間処理を行う必要がある場合、ページ要求に迅速に応答するために結果を返さずに判断を下す場合、以下のような措置が可能である.
この例の出力結果は出力プログラムstart.後でセッションが戻ってくるので、debugの出力ブラウザは受信できませんが、log.txtファイルは3つの完了時間を完全に受信できます.
二、fsockopen、cUrlの非ブロックモードを使用して別のウェブサイトを要求する
cURLのcurl_を利用multi_*関数非同期要求の送信{{かんすう:ひどうきようきゅうのそうしん}}
三、Gearman、Swooleを使用してGearmanを拡張するのはphp拡張を持つ分布式非同期処理フレームワークであり、大量の非同期タスクを処理することができる.Swooleは最近とても火がついていて、非同期の方法がたくさんあって、使いやすいです.(ホコリ注:PHPの再定義と称し、NodeJSを完膚なきまでに吹き飛ばす.Swooleツールは良いが、拡張自体はNodeJSとは比べものにならないような気がする)
四、redisなどのキャッシュ、キューを使用して、データをキャッシュに書き込み、バックグラウンド計画タスクを使用してデータ非同期処理を実現する.この方法は一般的な大流量アーキテクチャでよく見られるでしょう.
五、極端な場合、システムコマンドを呼び出すことができ、データをバックグラウンドタスクに伝えることができ、個人的には効率的ではないと感じます.
六、外国人の大技、理解できなかった、php原生支持http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
七、pcntl拡張をインストールし、pcntl_を使用するfork生成サブプロセス非同期実行タスクは,個人的には最も便利であるがzombie processも出現しやすい.
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
この例の出力結果は出力プログラムstart.後でセッションが戻ってくるので、debugの出力ブラウザは受信できませんが、log.txtファイルは3つの完了時間を完全に受信できます.
二、fsockopen、cUrlの非ブロックモードを使用して別のウェブサイトを要求する
$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.1\r
"
;
$http
.=
"Host: www.example.com\r
"
;
$http
.=
"Connection: Close\r
\r
"
;
fwrite(
$fp
,
$http
);
fclose(
$fp
);
cURLのcurl_を利用multi_*関数非同期要求の送信{{かんすう:ひどうきようきゅうのそうしん}}
$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
"End
"
;
三、Gearman、Swooleを使用してGearmanを拡張するのはphp拡張を持つ分布式非同期処理フレームワークであり、大量の非同期タスクを処理することができる.Swooleは最近とても火がついていて、非同期の方法がたくさんあって、使いやすいです.(ホコリ注:PHPの再定義と称し、NodeJSを完膚なきまでに吹き飛ばす.Swooleツールは良いが、拡張自体はNodeJSとは比べものにならないような気がする)
四、redisなどのキャッシュ、キューを使用して、データをキャッシュに書き込み、バックグラウンド計画タスクを使用してデータ非同期処理を実現する.この方法は一般的な大流量アーキテクチャでよく見られるでしょう.
五、極端な場合、システムコマンドを呼び出すことができ、データをバックグラウンドタスクに伝えることができ、個人的には効率的ではないと感じます.
$cmd
=
'nohup php ./processd.php $someVar >/dev/null &'
;
`
$cmd
`
六、外国人の大技、理解できなかった、php原生支持http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
七、pcntl拡張をインストールし、pcntl_を使用するfork生成サブプロセス非同期実行タスクは,個人的には最も便利であるがzombie processも出現しやすい.
if
((
$pid
= pcntl_fork()) == 0) {
child_func();
// ,
}
else
{
father_func();
//
}
echo
"Process "
.
getmypid
() .
" get to the end.
"
;
function
father_func() {
echo
"Father pid is "
.
getmypid
() .
"
"
;
}
function
child_func() {
sleep(6);
echo
"Child process exit pid is "
.
getmypid
() .
"
"
;
exit
(0);
}