思路很简单:php
开一个子进程处理异步事务,处理完以后,经过管道告诉父进程,并将返回数据写入管道shell
代码以下:json
AsynHttpClient.phpapi
<?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.phpswoole
require 'AsynHttpClient.php'; new AsynHttpClient("http://127.0.0.1:9000/api.php", function($data) { print_r($data); }); echo 1;
api.phpcurl
<?php echo json_encode([ 'state' => 'ok', 'data' => 'hello', ]);
php -S 127.0.0.1:9000
能够看到运行结果是1在前面, 证实是异步执行的.异步
其实经过php中的pcntl_fork和libevent也能够实现, 不须要借助swoole, 可是swoole提供的process确实很好用ui