PHP でマルチスレッドを実装する
なんて
? PHP 自体はマルチスレッドをサポートしていませんが、Web サーバーはマルチスレッドをサポートしています。
つまり、これは PHP でマルチスレッドを実装するための基礎でもあります。
現在、ファイル a.php を実行しているとします
。ただし、プログラム内で別の b.php も実行するように要求します
。その
ため、2 つのファイルは同時に実行されます。
が送信されると、クライアントが終了したかどうかに関係なく、WEB サーバーはそれを実行します。
場合によっては
、実行したいのは、別のファイルではなく、このファイル内のコードの一部である場合があります。
パラメータを使用して、a.php が実行するプログラムを制御できます。
例を次に示します。
//a .php
PHP コード:---------------------------------------------- ----------------------------------
<?php
関数 runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); // ここの 2 番目のパラメータは、HTTP プロトコルで指定されたリクエスト ヘッダーです。
//理解できない場合は、RFC の定義を参照してください
fclose($fp);
関数
a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
関数
b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
if(!isset($_GET['act'])) $_GET['act'] = 'a'
;
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>
------------------------------------------------ --------------------------------
result_a.log と result_b.log を開いて 2 つのファイルのアクセス時間を比較すると、これら 2 つが実際に異なるスレッドで実行されていることがわかります。
まったく同じ場合もあります。
上記は単なる例であり、他の形式に改良することもできます。
PHP でマルチスレッドが使用できるようになったので、問題が発生します。それは、PHP 自体がマルチスレッドをサポートしていないことです。では、
どうすればよいでしょうか。 1.
競合を避けるために、同じリソースにアクセスしないようにしてください。ただし、データベースは同時操作をサポートしているため、必要に応じ
て
同じファイルにデータを書き込まないでください。書き込みたい場合は、同期に他のメソッドを使用します。たとえば、flock を呼び出してファイルをロックするなどします。または、一時ファイルを作成し、別のスレッドでファイルが消えるのを待ちます。 while(file_exits('xxx'));この一時ファイルが存在する場合は、スレッドが実際に動作していることを意味し
、
そのようなファイルが存在しない場合は、他のスレッドがそれを解放したことを意味します。
マルチスレッドを実現するには、ノンブロッキングモードが必要です。つまり、fgets の
ような
関数を使用すると、プログラムが読み書きするときに問題が発生します。以下のプログラムはマルチスレッドではないので、実行する前に上記の戻りを待つ必要があります。そのため、データを交換する必要がある場合は、最終的に外部ファイルまたはデータを使用してそれを完了することができます。 $fp) を達成します。
ここまで述べましたが、これには実際的な意味があるのでしょうか?
ご存知のとおり、ネットワーク リソースを継続的に読み取るアプリケーションでは、ネットワークの速度がボトルネックになります。この方法を採用すると、
複数のスレッドで同時に異なるページを読み込むことができ、
8848やsoasoなどのモールサイトから情報を検索できるプログラムを作りました。アリババのウェブサイトからビジネス情報や企業ディレクトリを読み取るプログラムもあり、
この技術も利用されています。 どちらのプログラムも、情報を読み取ってデータベースに保存するためにサーバーに継続的に接続する必要があるためです。 この技術を活用することで、応答待ちのボトルネックを解消します。