思路很简单:
开一个子进程处理异步事务,处理完之后,通过管道告诉父进程,并将返回数据写入管道
代码如下:
AsynHttpClient.php
<?php
class AsynHttpClient
{
public $url;
public $callback;
private $process;
public function __construct($url, $callback)
{
$this->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
<?php
echo json_encode([
'state' => 'ok',
'data' => 'hello',
]);
php -S 127.0.0.1:9000
可以看到运行结果是1在前面, 证明是异步执行的.
其实通过php中的pcntl_fork和libevent也可以实现, 不需要借助swoole, 但是swoole提供的process确实很好用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。