当前位置: 首页 > 文档资料 > Swoole 中文文档 >

协程客户端

优质
小牛编辑
133浏览
2023-12-01

下列协程客户端是Swoole内置的类,其中 ⚠️ 标志的不要再使用,使用PHP原生的函数+一键协程化

超时规则

所有的网络请求(建立连接,发送数据,接收数据)都有可能超时,Swoole协程客户端设置超时的方式有三种:

  • 1、通过方法的参数传入超时时间,例如Co\Client->connect()Co\Http\Client->recv()Co\Mysql->query()等等, 这种方式的影响范围最小(只针对当前这次函数调用生效),优先级最高(当前这次函数调用将无视下面的2,3设置)。

  • 2、通过Swoole协程客户端类的set*()方法设置超时,例如:

     $client = new Co\Client(SWOOLE_SOCK_TCP);
     //或
     $client = new Co\Http\Client("127.0.0.1", 80);
     //或
     $client = new Co\Http2\Client("127.0.0.1", 443, true);
     $client->set(array(
         'timeout' => 0.5,//总超时,包括连接、发送、接收所有超时
         'connect_timeout' => 1.0,//连接超时,会覆盖第一个总的 timeout
         'write_timeout' => 10.0,//发送超时,会覆盖第一个总的 timeout
         'read_timeout' => 0.5,//接收超时,会覆盖第一个总的 timeout
     ));
    
     //Co\Redis() 没有 write_timeout 和 read_timeout 配置
     $client = new Co\Redis();
     $client->setOption(array(
         'timeout' => 1.0,//总超时,包括连接、发送、接收所有超时
         'connect_timeout' => 0.5,//连接超时,会覆盖第一个总的 timeout 
     ));
    
     //Co\Mysql() 没有 set 配置的功能
     $client = new Co\Mysql();
    
     //Co\Socket 通过 setOption 配置
     $socket = new Co\Socket(AF_INET, SOCK_STREAM, SOL_TCP);
     $timeout = array('sec'=>1, 'usec'=>500000);
     $socket->setOption(SOL_SOCKET, SO_RCVTIMEO, $timeout);//接受数据超时时间
     $socket->setOption(SOL_SOCKET, SO_SNDTIMEO, $timeout);//连接超时和发送数据超时的配置

    这种方式的影响只针对当前类生效,会被第1中方式覆盖,无视下面的第3种配置。

  • 3、可以看到上面2种方式超时设置规则很麻烦且不统一,为了避免开发者需要处处谨慎设置,从v4.2.10版本开始所有协程客户端提供了全局统一超时规则设置,这种影响最大,优先级最低,如下:

      Co::set([
          'socket_timeout' => 5,
          'socket_connect_timeout' => 1,
          'socket_read_timeout' => 1,
          'socket_write_timeout' => 1,
      ]);
    • -1: 永不超时
    • 0: 不更改超时时间
    • 其它大于0的值: 设置相应秒数的超时定时器, 最大精度为1毫秒,是浮点型,0.5代表500毫秒。
    • socket_connect_timeout, 建立TCP连接超时时间, 默认为1(秒)
    • socket_timeout, TCP读/写操作超时时间,如果想把读和写分开设置,参考下面的配置 默认为-1
    • socket_read_timeout, v4.3版本加入,TCP操作超时时间 默认为-1
    • socket_write_timeout,v4.3版本加入,TCP操作超时时间 默认为-1 即: 所有Swoole提供的协程客户端,如果没用前面的第1、2设置超时,默认连接超时时间为1s,读/写操作则永不超时。
PHP官方网络库超时

除了上述Swoole提供的协程客户端,在一键协程化里面我们使用的是原生PHP提供的方法, 它们的超时时间受default_socket_timeout配置影响, 开发者可以通过ini_set('default_socket_timeout', 60)这样来单独设置它, 它的默认值是60.