利用swoole_プロセスとeventloop php非同期プログラミングを実現

1718 ワード

考え方は簡単です.
サブプロセスを開いて非同期トランザクションを処理し、処理が完了したら、パイプを介して親プロセスに伝え、戻りデータをパイプに書き込む
コードは次のとおりです.
AsynHttpClient.php
url = $url;
        $this->callback = $callback;
        $this->run();
    }

    public function run()
    {
        $this->process = new swoole_process([$this, "callback"], true); 
        $this->process->start();
        swoole_event_add($this->process->pipe, function($pipe) {
            $content = $this->process->read();
            call_user_func($this->callback, $content);
            swoole_event_del($this->process->pipe);
        });
    }

    public function callback(swoole_process $process)
    {
        $ch = curl_init($this->url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $content = curl_exec($ch);

        curl_close($ch);
        
        $process->write($content);
    }
}

index.php
require 'AsynHttpClient.php';

new AsynHttpClient("http://127.0.0.1:9000/api.php", function($data) {
   print_r($data);
});

echo 1;

api.php
 'ok',
  'data' => 'hello',
]);
php -S 127.0.0.1:9000

実行結果が1であることがわかる、非同期実行であることが証明される.
実はphpのpcntlを通じてforkとlibeventも実現でき、swooleを借りる必要はありませんが、swooleが提供するプロセスは確かに使いやすいです.
https://www.iwantmoney.cn/art...