ホームページ  >  記事  >  バックエンド開発  >  PHPの非同期子実装メソッド

PHPの非同期子実装メソッド

WBOY
WBOYオリジナル
2016-06-13 13:24:53790ブラウズ

PHP非同期呼び出し実装メソッド

PHP 非同期呼び出し実装メソッド

ブラウザとサーバー間の通信にはコネクションレス型のHTTPプロトコルしかなく、クライアントがサーバーにリクエストを出し、サーバーはリクエストに応じて対応するプログラムを出力するという特徴があり、永続的な接続を維持することができません。 。

クライアントの対応するサーバーが 1 秒または 1 分間実行する可能性があり、このようにプログラムの実行が遅い場合、ユーザーは忍耐力を持たない可能性があります。デバイスの閲覧をオフにします。

プログラムの実行結果を気にする必要がない場合もあります。このように時間を無駄にして辛抱強く待つ必要はありません。その場合は、プログラムを待たずにバックグラウンドで静かに実行する方法を見つける必要があります。

たとえば、ユーザーが電子メール アカウントを入力またはインポートし、送信のためにサーバーに送信するというシナリオがあります。

PHPの非同期子実装メソッド
<?php <span style="color: #800080;">$count=<span style="color: #008080;">count</span>(<span style="color: #800080;">$emailarr</span>);<span style="color: #008000;">
</span><span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span>=0;<span style="color: #800080;">$i</span>$count;<span style="color: #800080;">$i</span>++)  
{  
  sendmail(.....);<span style="color: #008000;">//</span><span style="color: #008000;">发送邮件  </span><span style="color: #008000;">
</span>}  <span style="color: #0000ff;">
</span>?>  
PHPの非同期子実装メソッド

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

このとき、コードを実行するには「非同期実行」技術が必要です。非同期実行の特徴は、ユーザーがコードの実行結果を待つ必要がないことです。非同期実行を使用する利点:

1. アプリケーションの単一タスクへの依存を取り除く

2. プログラムの実行効率の向上

3. プログラムの拡張性の向上

4. 特定のシナリオにおけるユーザー エクスペリエンスの向上

5. PHP はマルチスレッドをサポートしていないため、非同期呼び出しを使用して複数の HTTP をリクエストすると、プログラムの並列実行の効果が得られます。ただし、リクエストされる HTTP リクエストが多すぎると、システムのオーバーヘッドが大きくなることに注意してください。増えました

?

PHP での一般的な非同期実行方法:

1. クライアント ページは AJAX テクノロジーを使用してサーバーにリクエストします

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


2.popen() 関数

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

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

?
pclose(popen(<span style="color: #0000ff;">"/home/xinchen/backend.php &"<table><tr> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> <code class="javascript plain">pclose(popen(<span style="color: #0000ff;">"/home/xinchen/backend.php &"</span>, <span style="color: #0000ff;">'r'</span>));
<span style="color: #0000ff;">'r'</span>));

  这个方法避免了第一个方法的缺点,并且也很快。但是问题是,这种方法不能通过HTTP协议请求另外的一个WebService,只能执行本地的脚本文件。并且只能单向打开,无法穿大量参数给被调用脚本。

并且如果,访问量很高的时候,会产生大量的进程。如果使用到了外部资源,还要自己考虑竞争。


3.CURL扩展

CURL是一个强大的HTTP命令行工具,可以模拟POST/GET等HTTP请求,然后得到和提取数据,显示在"标准输出"(stdout)上面

PHPの非同期子実装メソッド
<span style="color: #800080;">$ch</span> = curl_init();
 
<span style="color: #800080;">$curl_opt</span> = <span style="color: #0000ff;">array</span>(CURLOPT_URL, 'http://www.example.com/backend.php',
                            CURLOPT_RETURNTRANSFER, 1,
                            CURLOPT_TIMEOUT, 1,);
 
curl_setopt_array(<span style="color: #800080;">$ch</span>, <span style="color: #800080;">$curl_opt</span>);
 
curl_exec(<span style="color: #800080;">$ch</span>);
 
curl_close(<span style="color: #800080;">$ch</span>);
PHPの非同期子実装メソッド

使用CURL需要设置CUROPT_TIMEOUT为1(最小为1,郁闷)。也就是说,客户端至少必须等待1秒钟。

4.fscokopen()函数

fsockopen是一个非常强大的函数,支持socket编程,可以使用fsockopen实现邮件发送等socket程序等等,使用fcockopen需要自己手动拼接出header部分

官方文档:?http://cn.php.net/fsockopen/

?
<span style="color: #aa7700;">$fp</span> = <span style="color: #ff1493;">fsockopen</span>(<span style="color: #0000ff;">"www.example.com"</span>, 80, <span style="color: #aa7700;">$errno</span>, <span style="color: #aa7700;">$errstr</span>, 30);
<span style="color: #0000ff;">if</span> (!<span style="color: #aa7700;">$fp</span>) {
????<span style="color: #ff1493;">echo</span> <span style="color: #0000ff;">"$errstr ($errno)<br>\n"</span>;
} <span style="color: #0000ff;">else</span> {
????<span style="color: #aa7700;">$out</span> = <span style="color: #0000ff;">"GET /backend.php? / HTTP/1.1\r\n"</span>;
????<span style="color: #aa7700;">$out</span> .= <span style="color: #0000ff;">"Host: www.example.com\r\n"</span>;
????<span style="color: #aa7700;">$out</span> .= <span style="color: #0000ff;">"Connection: Close\r\n\r\n"</span>;
???
????fwrite(<span style="color: #aa7700;">$fp</span>, <span style="color: #aa7700;">$out</span>);
????<span style="color: #008200;">/*忽略执行结果 </span>
????<span style="color: #008200;">while (!feof($fp)) { </span>
????????<span style="color: #008200;">echo fgets($fp, 128); </span>
????<span style="color: #008200;">}*/</span>
????fclose(<span style="color: #aa7700;">$fp</span>);
}
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:ThinkPHP フレームワークに基づいた OAuth2.0 サービスの構築の準備次の記事:ThinkPHP フレームワークに基づいた OAuth2.0 サービスの構築の準備

関連記事

続きを見る