ホームページ  >  記事  >  バックエンド開発  >  PHPでマルチスレッドの非同期呼び出しを実装する方法

PHPでマルチスレッドの非同期呼び出しを実装する方法

黄舟
黄舟オリジナル
2017-11-11 13:49:075486ブラウズ

前回の記事ではPHPのマルチスレッドの実装方法をご紹介しましたが、今回はPHPで非同期マルチスレッドを実装する方法を詳しくご紹介しますので、この記事を通してさらに進めていただければ幸いです。 PHP のマルチスレッドについての理解が深まりました。

たとえば、ユーザーがメールアカウントを入力またはインポートして送信を実行するシナリオがあります。

最初の解決策:

<?php
$count=count($emailarr);
for($i=0;$i<$count;$i )
{
sendmail(.....);//发送邮件
}
?>

これです。このコードはユーザー エクスペリエンスが非常に悪いため、実際には使用できません。実際、大量の電子メールを送信すると、ユーザーの待ち時間が長くなり、システム製品に対する疑念が生じます。 。ただし、メッセージを正常に送信する前に、ユーザーは 1,000 件の電子メールがすべて送信されるまで待つ必要はありません。メッセージをバックグラウンドに送信した後、ユーザーにメッセージを送信するよう直接指示し、バックグラウンド プログラムにメッセージを通知せずに送信させることができます。 1つ。

2 番目の解決策:


コードを実行するために「非同期実行」テクノロジーを使用しようとします。非同期実行の特徴は、ユーザーが実行結果を待つ必要がないことです。非同期実行を使用する利点: 1. アプリケーションの単一タスクへの依存を取り除く

3. プログラムのスケーラビリティを向上させる

4.特定のシナリオでのユーザー エクスペリエンスを向上します

5. PHP はマルチスレッドをサポートしていないため、プログラムの並列実行の効果を実現するために非同期呼び出しを使用します。リクエストが要求されると、システムのオーバーヘッドが大幅に増加します。

ユーザー エクスペリエンス: ユーザーは待機中 - >送信完了

その後、ユーザーに「送信完了」が表示されると、メール送信タスクは個別にレターの送信を処理する PHP プログラムに転送されます。 、現時点では、メール送信プログラムはバックグラウンドで懸命に動作しており、1 つずつ手紙を送信しています

3 番目の方法:

1.クライアントに返される HTML コードに AJAX 呼び出しを埋め込むか、img タグ を埋め込むと、src は実行される時間のかかるスクリプトを指します。

この方法は最も簡単で早いです。サーバーは呼び出しを行う必要はありません。

ただし、欠点は、一般に、Ajax は onLoad の後にトリガーされる必要があることです。つまり、ユーザーがページをクリックして閉じた場合、バックグラウンド スクリプトはトリガーされません。 imgタグを使用した場合、このメソッドは厳密な意味での非同期実行とは言えません。ユーザーのブラウザは、php スクリプトの実行が完了するまで長時間待機します。つまり、ユーザーのブラウザの status
列には、常に読み込み中であることが表示されます。
もちろん、スクリプトタグなど、同様の原理を持つ他のメソッドを使用することもできます。
4 番目のメソッド:

popen()

<?php 
$domain="www.***.com"; 
$url="/system_mail.php"; 
$par="email=".implode(&#39;,&#39;,$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 &#39;&#39;发送完毕&#39;; 
?> 
system_mail.php 
<?php 
ini_set("ignore_user_abort",true); 
ignore_user_abort(true);//此处的代码需要php.ini开启相关的选项,保证php执行不超时的,不明白,参考我的另一篇文章 “关闭浏览器后,php脚本会不会继续运行” 
//获取email地址,发信,此处为发信代码 
?>

// 指定されたコマンド command の実行によって生成されたプロセスを指すパイプを開きます。指定されたコマンドを生成したコマンドの実行によって生成されたプロセスへのパイプを開きます。

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

resource popen ( string command, string mode );

この方法は、最初の方法の欠点を回避し、また高速です。ただし、問題は、このメソッドは HTTP プロトコルを通じて別の Web サービスをリクエストできず、ローカル スクリプト ファイルしか実行できないことです。また、一方向にのみ開くことができ、呼び出されたスクリプトに多数のパラメータを渡すことはできません。

そして、アクセス数が非常に多い場合、大量のプロセスが生成されます。外部リソースを使用する場合は、競合について自分で考慮する必要があります。


5番目の方法:

CURLを使用しますこの方法では、CUROPT_TIMEOUTを1に設定します(最小値は1です)。つまり、クライアントは少なくとも 1 秒待つ必要があります。

pclose(popen("/home/xinchen/backend.php &", &#39;r&#39;));

6 番目の方法:

fsockopen を使用する この方法は最も完璧なはずですが、欠点は、HTTP ヘッダー部分を自分で記述する必要があることです。

$ch = curl_init();
$curl_opt = array(CURLOPT_URL, &#39;http://www.example.com/backend.php&#39;,
                            CURLOPT_RETURNTRANSFER, 1,
                            CURLOPT_TIMEOUT, 1,);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);


概要:

上記の 6 つのメソッドは、PHP でのマルチスレッドの非同期呼び出しの例であり、それぞれに独自の特徴があり、必要に応じて適切なメソッドを選択できます。

関連する推奨事項;

PHPマルチスレッドシミュレーション実装の3つの方法の紹介

PHPマルチスレッド実装例


PHPマルチスレッドの実装方法 - シェル


PHPマルチスレッド小ケース

以上がPHPでマルチスレッドの非同期呼び出しを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。