Coroutine
- 开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护
- 同时由于底层封装了协程,所以对比传统的
PHP
层协程框架,开发者不需要使用yield
关键词来标识一个协程IO
操作,所以不再需要对yield
的语义进行深入理解以及对每一级的调用都修改为yield
,这极大的提高了开发效率
可以满足大部分开发者的需求。对于私有协议,开发者可以使用协程的TCP
或者UDP
接口去方便的封装。
- PHP版本要求:>= 7.0
- 基于
Server
、Http\Server
、WebSocket\Server
进行开发,底层在onRequet
, onReceive
, onConnect
等事件回调之前自动创建一个协程,在回调函数中使用协程API
- 使用或
go
方法创建协程,在创建的协程中使用协程API
$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();
});
- 全局变量:协程使得原有的异步逻辑同步化,但是在协程的切换是隐式发生的,所以在协程切换的前后不能保证全局变量以及
static
变量的一致性。 - 与
xdebug
、xhprof
、blackfire
等zend
扩展不兼容,例如不能使用xhprof
对协程server
进行性能分析采样。
- TCP/UDP Client:
Swoole\Coroutine\Client
- HTTP/WebSocket Client:
Swoole\Coroutine\HTTP\Client
- HTTP2 Client:
Swoole\Coroutine\HTTP2\Client
- Redis Client:
Swoole\Coroutine\Redis
- Mysql Client:
Swoole\Coroutine\MySQL
- PostgreSQL Client:
Swoole\Coroutine\PostgreSQL
- 在协程
Server
中需要使用协程版Client
,可以实现全异步Server
- 其他程序中可以使用
go
关键词手工创建协程