PHP マルチスレッド実装テクノロジの概要
ご存知のとおり、PHP にはマルチスレッドがありませんが、AJAX 非同期アクセスなどのいくつかのテクニックを使用してマルチスレッド効果を実現できます。の上。ここ数日間で私が遭遇した PHP 非同期呼び出しの要件とソリューションを要約します。
1. AJAX 非同期アクセス処理を実装するには、完全な操作インターフェイスと、進行状況を収集するための動的なプログレス バーが必要です。 (AJAX) AJAX を使用して実装し、ajax を通じてサーバーに継続的にアクセスし、setInterval を通じて間隔を設定し、data.php ファイルにアクセスしてデータを処理し、ページの対応する DOM コンテンツを更新します。
例:
<p> jQuery(document).ready(function($) { <br /> $('#submit').click(function(){ <br /> setInterval("updateMsg()", 1000); <br /> $.post('data.php', $('#form1').serialize(), function(data, textStatus){ <br /> var new_data = "<p>本次处理的数据总数为:" + data + "</p>"; <br /> $('#total_area').html(new_data); <br /> $('#monitor_area').html('<p>正在初始化信息监控.....</p>'); <br />}); <br /> $.post('test.php',$('#form1').serialize()); <br /> return false; <br /> });<br /> <br /> function updateMsg(){ <br /> $.get("backend.php",{},function(data, textStatus){ <br /> var now_total = "<p>目前已采集数量:" + data + "</p>"; <br /> $("#monitor_area").html(now_total); <br /> }); </p><p> } </p>
2. PHP メール送信リマインダー機能の実装。 (メッセージキュー) 申請者の情報を知り、できるだけ早く連絡したい登録システム。登録情報は 10 日以上に 1 件しか存在しない可能性があります。携帯電話のリマインダーは139にメールを送る方法を採用しています。しかし、問題があります。ユーザーが個人情報を送信するプログラム部分に電子メールを送信するためのコードを記述すると、送信プロセスが非常に遅くなり、場合によっては 3 秒以上かかるため、耐えられません。メールの送信などに時間がかかる場合には「キュー」という方式が使われます。もちろん、このキューは RabbitMQ や ZeroMQ ほど高度ではありません。実際には情報がデータベースに保存され、キューに入れられたものとしてカウントされ、データベース内の情報を処理するために cron が設定されます。 、これも愚かな方法です。
3. もちろん、どこにでもメッセージ キューが存在しますが、これは単なる最低の方法であり、同時実行性が高くなると必然的に失敗します。この時点で、伝説的な RabbitMQ を使用すると、パフォーマンスが大幅に向上するはずです。 Redis データベースもあります。私はこれを使用しましたが、そのリストをメッセージキューとして使用するのは非常に良いと思います
4. CURL メソッド、curl_multi も良いことだと言われています。ただし、CUROPT_TIMEOUT の最小値は 1 であるため、クライアントは少なくとも 1 秒待つ必要があり、これも欠陥です。
5. Popen() 関数は、指定されたコマンド command の実行によって生成されるプロセスを指すパイプを開きます。
<p>pclose(popen("/home/xinchen/backend.php &", 'r')); </p><p>fsockopen()</p>
この方法では、http ヘッダーを自分で結合する必要があります。 5. PHP のマルチプロセス。実際、この方法は、処理する大きなデータを for ループに従って小さなセグメントに分割し、vim を使用して処理してから
php –f example1.php &<br />php –f example2.php &この愚かな方法を使用して、PHP プロセスをバックグラウンドで実行します...PHP は、*uinx での C と同様に、pcntl を使用してプロセスを直接フォークアウトできます。この方法はデータを収集するときに非常に便利で、CURL と fsockopen を組み合わせると速度が非常に速くなります。
for($i = 0; $i <$intNum; $i++) {<br />$pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息<br />if($pids[$i] == -1) {<br />echo "couldn't fork". "n";<br />} elseif(!$pids[$i]) {<br />sleep(1);<br />echo "n"."第".$i."个进程 -> " . time(). "n";<br />//这里就可以放信息采集抓取等东西的代码了。<br />exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程<br />}<br />}6. Gearman 分散コンピューティングでは、実行のためにさまざまなマシンへのジョブの分散をサポートするために多くのワーカーを開きます。