ホームページ >バックエンド開発 >PHPチュートリアル >PHPで非同期処理を実装する方法
実際の運用環境では、php がバックエンド インターフェイス サーバーとして使用されることがよくあります。もちろん、php にはバックエンド サーバーとしての利点もありますが、クライアントが気にしない結果を処理する場合には欠点も生じます。いいえ、非同期実行のメカニズムはありません。たとえば、特定のクライアントの PHP へのアクセスのパフォーマンス (開始時刻、終了時刻、結果のステータスなどを含む) を記録したい場合、当然のことながら、クライアントは PHP の処理にできるだけ早く応答できるようにしたいと考えます。従来のソリューションをインストールした場合、クライアントは結果を取得する前に PHP がパフォーマンスの記録を完了するまで待つ必要があります。これは、現在の残高を確認するために銀行に行き、窓口係が駆け寄って他の人としばらく雑談するのと同じですが、窓口に来ても結果は同じです。
そのため、多くの場合、非同期操作を実行できる PHP が必要になります。
では、どうすれば非同期を実現できるのでしょうか?
解決策の 1 つは、これを達成するために php システム コールを使用して新しいプロセスを開始することです。
php は fsockopen 関数を提供します。この関数の機能は、指定されたホストへのソケット接続を初期化することです。デフォルトでは、ソケット接続はブロッキング モードで開かれます。もちろん、stream_set_blocking() を通じてノンブロッキング モードに変換することもできます。これが鍵です。したがって、アイデアは次のとおりです。ノンブロッキング ソケットを開いてローカル マシンに接続すると、ローカル マシンは受信後に時間のかかる処理を実行します。
次のような処理コード (posttest.php ファイル):
$fp = fsockopen($php_Path,80); if (!$fp) { LMLog::error("fsockopen:err" ); } else { $out = "GET /album/action/album_write_friends_thread_record.php?key=&u= HTTP/1.1\r\n"; $out .= "Host: ".$php_Path."\r\n"; $out .= "Connection: Close\r\n\r\n"; stream_set_blocking($fp,true); stream_set_timeout($fp,1); fwrite($fp, $out); usleep(1000); fclose($fp); }
ここで、usleep(1000) は非常に重要であり、このリクエストが確実に送信されるようにすることができます。
処理コードロジック (ファイル album_write_friends_thread_record.php) を検討しています:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2016-09-23 * Time: 09:26 */ /** * 客户端调用服务器接口页面 * user: guwen */ sleep(20);// 睡眠20s ?>实际上,我们服务器在执行fsockopen 那段程序时,就不会再等20s之后才能返回给客户端,而是发出这个请求之后,即返回客户端,销毁进程, 而把剩余的工作交由其他进程慢慢做去,这就实现了php的异步。
関連する推奨事項:
以上がPHPで非同期処理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。