利用swoole_プロセスとeventloop php非同期プログラミングを実現
考え方は簡単です.
サブプロセスを開いて非同期トランザクションを処理し、処理が完了したら、パイプを介して親プロセスに伝え、戻りデータをパイプに書き込む
コードは次のとおりです.
AsynHttpClient.php
index.php
api.php
実行結果が1であることがわかる、非同期実行であることが証明される.
実はphpのpcntlを通じてforkとlibeventも実現でき、swooleを借りる必要はありませんが、swooleが提供するプロセスは確かに使いやすいです.
https://www.iwantmoney.cn/art...
サブプロセスを開いて非同期トランザクションを処理し、処理が完了したら、パイプを介して親プロセスに伝え、戻りデータをパイプに書き込む
コードは次のとおりです.
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...