个人博客
$server = new Swoole\Http\Server('127.0.0.1', 9501, SWOOLE_BASE);
#1
$server->on('Request', function($request, $response) {
$mysql = new Swoole\Coroutine\MySQL();
#2
$res = $mysql->connect([
'host' => '127.0.0.1',
'user' => 'root',
'password' => 'root',
'database' => 'test',
]);
#3
if ($res == false) {
$response->end("MySQL connect fail!");
return;
}
$ret = $mysql->query('show tables', 2);
$response->end("swoole response is ok, result=".var_export($ret, true));
});
$server->start();
在这段代码中 我们启动了一个基于swoole 实现的http服务器监听客户端请求,如果有onRequest事件发生,则通过基于swoole协程实现的异步mysql 客户端组件对mysql服务器发起联建请求,并执行查询操作,然后将结果以响应方式返回给http客户端Swoole\Http\Server
的 onRequest
事件回调函数时,底层会调用 C 函数 coro_create
创建一个协程(#1
位置),同时保存这个时间点的 CPU 寄存器状态和 ZendVM 堆栈信息;mysql->connect
时会发生 IO 操作,底层会调用 C 函数 coro_save
保存当前协程的状态,包括 ZendVM 上下文以及协程描述信息,并调用 coro_yield
让出程序控制权,当前的请求会挂起(#2
位置);#3
位置);编程范式
Channel
(后面会介绍具体使用)
zend_execute_ex
或者 zend_execute_internal
这两个函数,需要特别注意一下 C 栈,可以使用 co::set
重新设置 C 栈大小