1

そこで、PHP で非同期 Web サービスを作成したいと考えています。なんで?私は素晴らしい非同期フロントエンドを持っていますが、アクティブな TCP 接続が 6 つ以上ある場合、Chrome は私のリクエストをブロックします。もちろん、私は次のようないくつかの同様の質問を読みました:

しかし、これらは私の質問をカバーしていません。

PHPが他のリクエストをブロックしないように、異なるスレッドで複数のリクエストを作成できるようにするためにインストールpthreadsしました(私の状況では、たとえば長いプロセスを開始し、プロセスがまだ忙しいかどうか)。

PHPReact は優れたライブラリ (ノンブロッキング I/O、非同期) のようですが、これも機能しません (まだ同期)。

私は何かが欠けていますか、それともこれはPHPではまだ不可能ですか?

class Example{
    private $url;   
    function __construct($url){
        $this->url = $url;
        echo 'pooooof request to ' . $this->url . ' sent <br />';
        $request = new Request($this->url);     
        $request->start();
    }
}

class Request extends Thread{
    private $url;   
    function __construct($url){
        $this->url = $url;
    }

    function run(){
        // execute curl, multi_curl, file_get_contents but every request is sync
    }
}

new Example('https://gtmetrix.com/why-is-my-page-slow.html');
new Example('http://php.net/manual/en/function.file-get-contents.php');
new Example('https://www.google.nl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=php%20file%20get%20contents'); 

理想的な状況は、コールバックを利用することです。

ps。この機能を提供しているいくつかのサーバー (Node.js など) を見てきましたが、私はネイティブ アプローチを好みます。これが不可能な場合は、Python、Java、Scala、または非同期をサポートする他の言語に切り替えることを真剣に考えています。

4

1 に答える 1

3

何をしているのか全く理解できない…

  • 非同期と並列は交換可能な言葉ではありません。
  • Web アプリケーションのフロントエンドのスレッドは意味がありません。
  • 多くの I/O バウンド タスクを同時に実行するためにスレッドは必要ありません。これがノンブロッキング I/O の目的です (非同期並行性)。
  • 並列並行性は、ここではやり過ぎのように思えます。

とにかく、リクエストが同期しているように見える理由は、このコンストラクターの記述方法です。

function __construct($url){
    $this->url = $url;
    echo 'pooooof request to ' . $this->url . ' sent <br />';
    $request = new Request($this->url);     
    $request->start();
}

Requestスレッドは、制御が (new) の呼び出し元に返される前に結合されます。__constructこれは、変数がスコープ外になり、破棄されるためです (結合は破棄の一部です)。

于 2015-08-13T08:20:22.187 に答える