ホームページ  >  記事  >  バックエンド開発  >  PHPマルチスレッド実装例

PHPマルチスレッド実装例

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

php マルチスレッドは、php を初めて使用する多くの友人にとって、またそれが何に使用されるのか少し不明瞭です。そこで、今日は php マルチスレッドの実装事例について説明します。

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

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

場合によっては、実行したいのは別のファイルではなく、このファイル内のコードの一部である場合、どうすればよいでしょうか?

実際、パラメータを使用して a.php を実行するプログラムを制御します。

例を見てみましょう:

//a.php

PHP代码:--------------------------------------------------------------------------------
<?php
    function runThread()
    {
        $fp = fsockopen(&#39;localhost&#39;, 80, $errno, $errmsg);
        
        fputs($fp, "GET /a.php?act=b\r\n\r\n");        //这里的第二个参数是HTTP协议中规定的请求头
                                //不明白的请看RFC中的定义
        
        fclose($fp);
    }
    function a()
    {
        $fp = fopen(&#39;result_a.log&#39;, &#39;w&#39;);
        fputs($fp, &#39;Set in &#39; . Date(&#39;h:i:s&#39;, time()) . (double)microtime() . "\r\n");
        
        fclose($fp);        
    }
    function b()
    {
        $fp = fopen(&#39;result_b.log&#39;, &#39;w&#39;);
        fputs($fp, &#39;Set in &#39; . Date(&#39;h:i:s&#39;, time()) . (double)microtime() . "\r\n");
        
        fclose($fp);        
    }
    if(!isset($_GET[&#39;act&#39;])) $_GET[&#39;act&#39;] = &#39;a&#39;;
    
    if($_GET[&#39;act&#39;] == &#39;a&#39;)
    {
        runThread();
        a();
    }
    else if($_GET[&#39;act&#39;] == &#39;b&#39;) b();
?>
--------------------------------------------------------------------------------

result_a.log と result_b.log を開いて、2 つのファイルのアクセス時間を比較してください。これらは異なるスレッドで実行されます

まったく同じ場合もあります


上記は単なる例であり、

他の

フォームに改良することもできます。 PHP もマルチスレッド化できるため、問題も発生します。 PHP 自体がマルチスレッドをサポートしていないことはわかっています。それでは、同じリソースにアクセスしないようにする必要があります。競合を避けるため、

データベース

を同時に操作することができます。そのため、マルチスレッドPHPでは、同じファイルにデータを書き込まないでください。 .. たとえば、北京天安婦人科病院に電話してファイルをロックするなどします。または、一時ファイル

を作成し、別のスレッドでこのファイルが消えるのを待ちます。これは、while(file_exits('xxx')); と同等です。この一時ファイルが存在する場合は、スレッドが実際に動作していることを意味します。ファイルが存在しない場合は、runThread が fputs を実行した後、このソケットからデータを読み取らないようにしてください。マルチスレッドが必要な場合は、ノンブロッキング モードを使用する必要があります。つまり、fgets のような関数がすぐに返される場合、データの読み取りと書き込みに問題が発生します。ブロッキング モードを使用すると、プログラムはマルチスレッドではなくなります。以下のプログラムは戻った後にのみ実行されるため、データを交換する必要がある場合は、最終的に外部ファイルまたはデータを使用して完了することができます。

要約:

と言ったように、これには実際的な意味があるのでしょうか? 誰もが知っているように、継続的に実行するアプリケーションでは、答えは「はい」です。この形式を採用すると、

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

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

PHP マルチスレッドの小さなケース

PHP マルチスレッド処理の問題について

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

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