ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでのマルチスレッド プログラム コードの非同期呼び出しの実装

PHP_PHP チュートリアルでのマルチスレッド プログラム コードの非同期呼び出しの実装

WBOY
WBOYオリジナル
2016-07-20 11:11:02726ブラウズ

この記事では、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

コードは次のとおりです$domain="www. ***.com";

$url="/system_mail.php";
$par="email=".implode(',',$emailarr)."&...";
$header = "POST $url HTTP/1.0rn";
$header .= "Content-Type: application/x-www-form-urlencodedrn";
$header .= "Content-Length: " . strlen($par ) . "rnrn" ;
$fp = @fsockopen ($domain, 80, $errno, $errstr, 30);
fputs ($fp, $header . $par);
fclose($fp);

echo ''送信完了' ;

?>

system_mail.php
ini_set("ignore_user_abort",true);
ignore_user_abort(true);//ここのコードでは、関連するオプションを有効にするために php.ini が必要です。 php の実行がタイムアウトしないようにするには、私の他の記事「ブラウザを閉じた後も php スクリプトは実行され続けますか?」を参照してください。
//メールを送信するためのコードは次のとおりです。
?> ;

非同期モードに変更した後、ユーザーは情報を送信して、すぐに「送信完了」の結果を得ることができます。レターは送信されるまでバックグラウンドで 1 つずつ送信されます。


テスト後、いくつかの方法をまとめて共有します:
1. 最も簡単な方法は、クライアントに返される HTML コードに AJAX 呼び出しを埋め込むか、オブジェクトを指す src を含む img タグを埋め込むことです。時間のかかるスクリプトが実行されます。
この方法は最も簡単で早いです。サーバーは呼び出しを行う必要はありません。
しかし、欠点は、通常、Ajax は onLoad の後にトリガーされる必要があることです。つまり、ユーザーがページをクリックして閉じた場合、バックグラウンド スクリプトはトリガーされません。
imgタグを使用した場合、このメソッドは厳密な意味での非同期実行とは言えません。ユーザーのブラウザは、php スクリプトの実行が完了するまで長時間待機します。つまり、ユーザーのブラウザのステータス バーには、常にロード中であることが表示されます。
もちろん、スクリプトタグなど、同様の原理を持つ他のメソッドを使用することもできます。

2. Popen()

resource Popen (string command, string mode);
//指定されたコマンドコマンドの実行の結果として生じるプロセスを指すパイプを開きます。指定されたコマンドの実行をフォークすることによって生成されたプロセスへのパイプを開きます。

したがって、それを呼び出すだけで、その出力は無視できます。

コードをコピーします
コードは次のとおりです コードをコピーします
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);

if (!$fp ) { $out = "GET /backend.php / HTTP/1.1rn";
echo "$errstr ($errno)
n";

} else {
$out .= "ホスト: www .example.comrn";

$out .= "接続: Closernrn";

fwrite($fp, $out);

/*実行結果を無視

while (!feof( $fp)) {

echo fgets($fp, 128);

}*/

fclose($fp);

}


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/444683.html技術記事この記事では、PHP での非同期呼び出しマルチスレッド メソッドの実装について詳しく紹介します。以下では、ユーザーがサービスを送信するために電子メール アカウントを入力またはインポートします。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。