マルチスレッドをシミュレートするためのPHP非同期実行方法 (転載記事)
出典:
http://hi.baidu.com/aqw518/blog/item/1e5cd4116ec52244f919b840.html
PHP 自体にはマルチスレッドがありませんが、カーブを使用して同じ効果を作成できます。たとえば、非同期呼び出しを実現するマルチプロセス方法はコマンド モードに限定されます。
Web プログラムで使用できるもっと簡単な方法もあります。つまり、要求されたページ (URL. ) は、何かを非同期的に実行することと同じです。
キーコードは次のとおりです:
$fp = fsockopen('localhost',80,&$errno,&$errstr,5); >
if(!$fp)
{
echo "$errstr ($errno)
n";
}
fputs($fp,"GET another_page. php?flag =1rn");
fclose($fp);
上記のコードは、another_page.php ページにリクエストを送信し、無視します。 の応答データを待つ必要はありません。これを使用して、リクエストされたページ another_page.php が非同期的に何かを実行できます。
たとえば、非常に実用的なアプリケーションでは、新しいブログを公開するたびに、ブログのすべての購読者に電子メール通知を送信する必要があります。
ログを書き込んだ後 -> 送信ボタンをクリックします -> ログをデータベースに挿入します -> 公開が成功したことを作成者に通知します
成功プロンプトが表示されるまで送信ボタンを押すと、電子メール サービスへの接続が異常であるか、サーバーが遅いか、購読者が多すぎるなどの理由で、基本的に電子メールが送信されるまで長時間待機します。実際、メールの送信が成功したかどうかに関係なく、基本的にはログが正常に保存されていれば問題ないため、メールの送信を待つプロセスは非常に不経済です。このプロセスは非同期で実行できます。電子メール送信の結果は重要ではありません。または、フォームは将来の参照のために記録されます。
改善されたプロセスは次のとおりです:
ログの書き込み後 -> 送信ボタンをクリックします -> ログがデータベースに挿入されます ---> 公開の成功をライターに通知します
└ メール通知を送信する -> [ログを書き留める]
実際にプログラムを書いてテストします。 write.php と sendmail.php を使用します。 sendmail.php 内) を使用して、プログラムの実行にかかる時間をシミュレートします。
write.php、実行には 1 秒かかります:
function asyn_sendmail()
{
$fp = fsockopen('localhost ' ,80,&$errno,&$errstr,5);
if(!$fp)
{
echo "$errstr ($errno)
n" ;
}
sleep(1);
fputs($fp,"GET /sendmail.php?param=1rn"); #要求されたリソース URL は正しく記述されている必要があります
fclose($fp);
}
echo time().'
';
echo 'call asyn_sendmail
';
asyn_sendmail();
echo time().'
';
sendmail.php、実行には 10 秒かかります:
<
sleep(10);
fopen("C:" . time(), "w");
ページを通じて write.php にアクセスします。出力:
1272472697
call asyn_sendmail
1272472698
、C で: ファイルを生成:
1272472708
上記の結果から、sendmail.php には少なくとも 10 秒かかりますが、write.php の実行はブロックされず、このプロセスが非同期であることがわかります。