Swoole Coroutine is similar to Coroutine in the other lanaguge or frameworks. Swoole create one coroutine for each reqeust and schedule based on IO status. It is not necessary to use callback in the server side logic.
PHP Coroutine is supported for Swoole version > 2.0 by default.
If you like to disable the coroutine feature, use --disable-coroutine
when compiling the Swoole PHP extension.
Please compare the difference between callback version and coroutine version in the example bellow.
Channel
can be used to sync multiple coroutines:
<php?
$c = new chan(1);
$c->push($data);
$c->pop();
PHP build-in functions like sleep
are not supported by Swoole, please use the coroutine version API:
<?php
co::sleep(100);
co::fread($fp);
co::gethostbyname('www.google.com');
The following client are supported in Swoole Coroutine:
You can also wrap your own client with Swoole TCP or UDP coroutine client.
swoole_server
and swoole_http_server
create one coroutine for each request, then maintain and schedule the request based on client side IO status within swoole_server
and swoole_http_server
.
You can use coroutine client within the following callback functions:
<?php
<?php
$server = new Swoole\Http\Server("127.0.0.1", 9502, SWOOLE_BASE);
$server->set([
'worker_num' => 1,
]);
$server->on('Request', function ($request, $response) {
$tcpclient = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
$tcpclient->connect('127.0.0.1', 9501,0.5)
$tcpclient->send("hello world\n");
$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setDefer();
$redis->get('key');
$mysql = new Swoole\Coroutine\MySQL();
$mysql->connect([
'host' => '127.0.0.1',
'user' => 'user',
'password' => 'pass',
'database' => 'test',
]);
$mysql->setDefer();
$mysql->query('select sleep(1)');
$httpclient = new Swoole\Coroutine\Http\Client('0.0.0.0', 9599);
$httpclient->setHeaders(['Host' => "api.mp.qq.com"]);
$httpclient->set([ 'timeout' => 1]);
$httpclient->setDefer();
$httpclient->get('/');
$tcp_res = $tcpclient->recv();
$redis_res = $redis->recv();
$mysql_res = $mysql->recv();
$http_res = $httpclient->recv();
$response->end('Test End');
});
$server->start();
The following extensions have to be disabled to use Swoole Coroutine:
Swoole Coroutine Documents: https://www.swoole.co.uk/docs/modules/swoole-coroutine
Swoole Coroutine methods: https://www.swoole.co.uk/docs/modules/swoole-coroutine/methods