× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Server

ServerHttp\Server将为每一个请求创建对应的协程,

  • 开发者可以在onRequetonReceiveonConnect 事件回调中使用协程客户端
  • 使用协程后onConnectonReceiveonClose是在不同的协程中并发执行的,需要注意进行状态检测

相关配置

Swoole\Serverset方法中增加了一个配置参数max_coroutine,用于配置一个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()函数时,会触发进行协程切换,此时Server可以去处理其他的事件或者接受新的请求。当此客户端连接成功或者后端服务回包后,底层会恢复协程上下文,代码逻辑继续从切换点开始恢复执行。开发者整个过程不需要关心整个切换过程。具体使用可以参考Coroutine\Client的文档。


  • threestone

    你在逗我么?越玩越大?

  • tmacfan

    协程的切换是怎么做到隐式的,能不能说明一下原理

  • xhc

    什么版本可以支持手动触发协程切换?

  • 马秉尧

    PHP 7 中,使用原生的 call_user_func 和 call_user_func_array 调用包含有协程代码的函数也会让程序挂起不能执行。

  • mak

    好像只能在server中事件的回调函数中直接使用,如果写在外面的函数或者类里面,会出现问题,函数的return和协程不能正常地切回函数调用的上下文。

  • 刘小跃

    可以变通一下: public function onReceive:(...........){ $swoole_mysql = new Swoole\Coroutine\MySQL(); $swoole_mysql->connect($config); $res = Foo::bar($swoole_mysql, [..............]); } 然后在Foo::bar方法里面随便用。

  • 迷宫罐

    协程这一系列的工具,必须在server的onRequest等环境下才能使用,不方便调试。 是否有什么方法可以判断,当前是否处于可以使用协程的环境下呢?

  • 戦场原礼亜

    我也想知道协程的切换是怎么做到隐式的。 按说任务调度器直接运行协程程序才能使用yield语法进行协程切换呀

  • 宇宙星辰

    什么时候能支持capwap协议

  • 江南夜雨

    根据我的理解,估计worker进程在遇到io调用(网络io或文件io)就会切换协程,所以做到隐式切换的,然后加入到eventloop,当事件发生时再唤醒协程,猜测,不对勿喷^^

  • Gavin_new

    有golang协程的影子

  • dana

    我把 这个示列代码 拿过去连接失败 9501 可以连接 后面的不可以 这个怎么解决

  • dana

    为什么实例 的clinet 连接失败