swoole_server
和swoole_http_server
将为每一个请求创建对应的协程,
onRequet
、onReceive
、onConnect
事件回调中使用协程客户端onConnect
、onReceive
、onClose
是在不同的协程中并发执行的,需要注意进行状态检测在Swoole\Server
的set
方法中增加了一个配置参数max_coro_num
,用于配置一个Worker
进程最多同时处理的协程数目。因为随着Worker
进程处理的协程数目的增加,其占用的内存也会增加,为了避免超出php的memory_limit
限制,请根据实际业务的压测结果设置该值,默认为3000
$http = new swoole_http_server("127.0.0.1", 9501);
$http->on("request", function ($request, $response) {
$client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
$client->connect("127.0.0.1", 8888, 0.5);
//调用connect将触发协程切换
$client->send("hello world from swoole");
//调用recv将触发协程切换
$ret = $client->recv();
$response->header("Content-Type", "text/plain");
$response->end($ret);
$client->close();
});
$http->start();
当代码执行到connect()和recv()
函数时,swoole会触发进行协程切换,此时swoole可以去处理其他的事件或者接受新的请求。当此client连接
成功或者后端服务回包
后,swoole server会恢复协程上下文,代码逻辑继续从切换点开始恢复执行。开发者整个过程不需要关心整个切换过程。具体使用可以参考client的文档。