ホームページ >php教程 >php手册 >php でのマルチスレッドの簡単な分析~

php でのマルチスレッドの簡単な分析~

WBOY
WBOYオリジナル
2016-06-21 09:14:05966ブラウズ

マルチスレッド

PHP でマルチスレッドを実装するなんて?
PHP 自体はマルチスレッドをサポートしていないことはわかっていますが、Web サーバーはマルチスレッドをサポートしています。

つまり、複数の人が同時にアクセスできるということは、私がマルチスレッドを実装するための基礎でもあります。 PHP でスレッド化します。

今、ファイル a.php が実行されているとします。しかし、プログラムでは、WEB サーバーに別の b.php を実行するようリクエストします

。すると、2 つのファイルが同時に実行されます

( PS: リンクリクエストが送信された後、WEB サーバーはクライアントが終了したかどうかに関係なく実行されます)

場合によっては、実行したいのは別のファイルではなく、このファイル内のコードの一部である必要があります。実際、どのプログラムを実行するかはパラメータ .php で制御できます。

以下の例を見てください:

//a.php

PHP コード:----------- -------------------------------------------------------- -------------- -------

function 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); fopen('result_b.log', 'w');
fputs($fp , 'に設定' . 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')); これは、一時ファイルが存在するということは、スレッドが実際に動作していることを意味します

そのようなファイルがない場合は、他のスレッドがすでにこれを解放していることを説明してください

2. runThreadがfputsを実行した後は、このソケットからデータを読み取らないようにしてください。 -threading では、ノンブロッキング モードを使用する必要があります。つまり、fgets

のような関数では、データの読み取りと書き込みに問題が発生します。ブロッキング モードを使用すると、プログラムはマルチスレッドではなくなります。 . 次のプログラムを実行する前に、上記の戻りを待つ必要があります。そのため、データを交換する必要がある場合は、最終的にファイルまたはデータ内の Completed を使用してください。

これには実際的な意味があるのでしょうか?

誰もが知っているように、ネットワーク リソースを常に読み取るアプリケーションでは、ネットワークの速度が重要になります。この形式を採用すると、

複数のスレッドで同時に異なるページを読むことができます

8848やsoasoなどのショッピングモールのWebサイトから情報を検索できるプログラムを作りました。アリババのウェブサイトからビジネス情報や企業ディレクトリを読み取るプログラムもあり、この技術も利用されています。 どちらのプログラムも、情報を読み取ってデータベースに保存するためにサーバーに継続的に接続する必要があるためです。 このテクノロジーを使用すると、応答を待つ際のボトルネックが解消されます。


これは議論を促進するためのものです、皆さんがもっと議論してくれることを願っています~~~~~~~










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