ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでのマルチスレッド プログラム コードの非同期呼び出しの実装
この記事では、PHP での非同期呼び出しマルチスレッド メソッドの実装について詳しく紹介します。次に、1,000 人のユーザーに推奨メールを送信します。ユーザーは、メール アカウントを入力またはインポートし、実行のためにサーバーに送信します。
たとえば、推奨メールを 1,000 人のユーザーに送信するシナリオがあります。ユーザーはメール アカウントを入力またはインポートし、送信のためにサーバーに送信します。
コードは次のとおりです | コードをコピー |
$sqlserver/42852.htm target=_blank >count=count($emailarr); for($i=0) ;$i< ;$count;$i ) { sendmail(....);//メールを送信 } ?> |
このコードはユーザーエクスペリエンスが非常に悪いので、実際に使用すると、まず、あまりにも多くの電子メールを送信すると、サーバーがタイムアウトしてしまいます。実際、ユーザーの待ち時間が長いため、ユーザーはシステム製品に対する疑問を抱き、信頼を失うことになります。ただし、ユーザーは、電子メールを正常に送信する前に 1,000 件の電子メールがすべて送信されるまで待つ必要はありません。バックグラウンドに送信した後、ユーザーに送信が成功するよう直接プロンプトを表示し、バックグラウンド プログラムに電子メールを 1 つずつサイレントに送信させることができます。 。
このとき、コードを実行するには「非同期実行」技術が必要です。非同期実行の特徴は、ユーザーがコードの実行結果を待つ必要がないことです。 :
1. 単一タスクの依存関係を取り除く
2. プログラムの実行効率を向上させる
4. 特定のシナリオにおけるユーザーエクスペリエンスを向上させる
5. PHP はマルチスレッドをサポートしていないため、非同期呼び出しリクエストを使用します。複数の HTTP メソッドはプログラムの並列実行の効果を実現しますが、HTTP リクエストが多すぎるとシステムのオーバーヘッドが大幅に増加することに注意してください
ユーザー エクスペリエンス: ユーザーは待ちます -> 送信完了
友達は、なぜ送信リンクが見つからないのかと尋ねます。
送信プロセスでは、ユーザーがリクエストを送信すると、送信タスクは送信を個別に処理する PHP プログラムに転送されます。ユーザーに「送信完了」と表示された時点では、レターはまだ送信されていません。送信プログラムがバックグラウンドで懸命に動作し、文字を 1 つずつ送信しています
sendmail.php
コードをコピーします | |||||||||||
コードは次のとおりです | コードをコピーします |
pclose(popen("/home/xinchen/backend.php &", 'r')); |
このメソッドは、最初の方法、そして非常に迅速です。ただし、問題は、このメソッドは HTTP プロトコルを通じて別の Web サービスをリクエストできず、ローカル スクリプト ファイルしか実行できないことです。また、一方向にのみ開くことができ、呼び出されたスクリプトに多数のパラメータを渡すことはできません。
そして、アクセス数が多ければ、大量のプロセスが生成されます。外部リソースを使用する場合は、競合について自分で考慮する必要があります。
3. CURL
メソッドを使用し、CUROPT_TIMEOUT を 1 に設定します (最小値は 1 です)。つまり、クライアントは少なくとも 1 秒待つ必要があります。
コードは次のとおりです | コードをコピー |
$ch =curl_init(); $curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php', CURLOPT_RETURTRANSFER 、 1, CURLOPT_TIMEOUT, 1,); curl_close($ch); 4 の使用が最も完璧ですが、欠点は次のとおりです。 HTTP ヘッダー部分を自分で取り出します。 コードは次のとおりです コードをコピーします |
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
echo "$errstr ($errno) n"; | } else { |
$out .= "ホスト: www .example.comrn"; $out .= "接続: Closernrn";
fwrite($fp, $out); /*実行結果を無視while (!feof( $fp)) { echo fgets($fp, 128);}*/ fclose($fp);}
|