PHP
语言不支持多线程,因此 Swoole
使用多进程模式。
在多进程模式下存在进程内存隔离,解决方案就是使用 MySQL、MongoDB、Redis 等外部存储服务。
PHP
提供的 MySQL
、CURL
、Redis
等客户端是同步的,会导致服务器程序发生阻塞。
Swoole
提供了常用的异步客户端组件,来解决此问题。编写纯异步服务器程序时,可以使用这些异步客户端。
在最新的Swoole 4.x
版本中移除了这些异步模块,将使用协程客户端代替。
使用协程可以以传统同步编程的方法编写代码,底层自动切换为异步IO
,既保证了编程的简单性,又可借助异步IO
。
使用协程客户端
$http = new swoole_http_server("0.0.0.0", 9501);
$http->on('request', function ($request, $response) {
$db = new Swoole\Coroutine\MySQL();
$db->connect([
'host' => '127.0.0.1',
'port' => 3306,
'user' => 'user',
'password' => 'pass',
'database' => 'test',
]);
$data = $db->query('select * from test_table');
$response->end(json_encode($data));
});
$http->start();
上面的代码编写与同步阻塞模式的程序完全一致的。但是底层自动进行了协程切换处理,变为异步IO
。
协程:并发 shell_exec
在PHP
程序中经常需要用shell_exec
执行一些命令,而普通的shell_exec
是阻塞的,如果命令执行时间过长,那可能会导致进程完全卡住。 在Swoole4
协程环境下可以用Co::exec
并发地执行很多命令。
并发 shell_exec
<?php
$c = 10;
while($c--) {
go(function () {
//这里使用 sleep 5 来模拟一个很长的命令
co::exec("sleep 5");
});
}
执行