协程客户端
优质
小牛编辑
133浏览
2023-12-01
下列协程客户端是Swoole内置的类,其中 ⚠️ 标志的不要再使用,使用PHP原生的函数+一键协程化。
- 协程TCP/UDP客户端
- 协程HTTP客户端
- 协程HTTP2客户端
- 协程PostgreSQL客户端
- 协程Socket客户端
- ⚠️ 协程Redis客户端
- ⚠️ 协程MySql客户端
- ⚠️ 协程System(Coroutine\System),主要是文件操作相关的不推荐使用。
超时规则
所有的网络请求(建立连接,发送数据,接收数据)都有可能超时,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.