PHP Swoole Client

慈云数据 2024-05-30 技术支持 35 0

PHP常用socket创建TCP连接,使用CURL创建HTTP连接,为了简化操作,Swoole提供了Client类用于实现客户端功能,并增加了异步非阻塞模式,让用户在客户端也能使用事件循环。

PHP Swoole Client
(图片来源网络,侵删)

作为客户端使用,Swoole Client可以在FPM环境下或 Apache中使用,但不允许使用Async异步模式,只能使用同步非阻塞模式,异步非阻塞模式仅限CLI模式下使用。

Client提供了TCP/UDP socket的客户端的封装代码,使用时仅需new Swoole\Client。

PHP Swoole Client
(图片来源网络,侵删)

Swoole的socket客户端对比PHP提供的stream族函数有什么优势呢?

stream函数存在超时设置的陷阱和Bug,一旦没有处理好将会导致服务器长时间阻塞。

stream和fread有8192长度限制,无法支持UDP大包。

swoole_client客户端支持waitall,在知道包长度的情况下可以一次取完不必循环获取。

swoole_client支持UDP的connect解决了UDP串包的问题

swoole_client是纯C的代码

swoole_client支持异步非阻塞回调

构造方法 constructor

Swoole的Client功能封装为一个swoole_client类,可通过new swoole_client来创建一个客户端实例。

原型

 

swoole_client->__construct(
  int $sock_type, 
  int $is_async = SWOOLEL_SOCK_SYNC, 
  string $key
);

参数
参数1:int $sock_type

$sock_type 表示socket类型,可使用swoole提供的宏来指定类型。

  • SWOOLE_TCP 创建TCP Socket
  • SWOOLE_TCP6 创建IPv6 TCP Socket
  • SWOOLE_UDP 创建UDP Socket
  • SWOOLE_UDP6 创建IPv6 UDP Socket
  • SWOOLE_SSL 开启SSL加密
  • SWOOLE_KEEP 开启连接复用

    其中SWOOLE_SSL与SWOOLE_KEEP不能单独使用,需要与前四个选项共同作用

     

    // 创建并开启SSL加密的TCP客户端
    $client = new swoole_client(SWOOLE_TCP | SWOOLE_SSL);

    SWOOLE_KEEP

    swoole_client支持在PHP-FPM或Apache中建立一个TCP长连接到服务器,当客户端启用SWOOLE_KEEP选项后,一个请求结束不会关闭socket,下一次再进行connect连接时会自动复用上次创建的连接。如果执行connect连接时发现连接已经 被服务器断开,那么connect将会创建新的连接。

    // 创建一个可以在FPM中使用的长连接客户端

    $client = new swoole_client(SWOOLE_TCP | SWOOLE_KEEP);

    SWOOLE_KEEP建立TCP长连接有什么优势呢?

    TCP长连接可以减少connect建立连接时的三次握手和close断开连接的四次挥手所带来的额外IO开销

    降低服务器connect建立连接和close断开连接的次数

    例如:在PHP-FPM模式下可以使用同步模式的swoole_client向后端发送数据,为了能够让不同的连接复用同一个客户端client,可以开启SWOOLE_KEEP选项并指定对应的key。这样对于同一个逻辑就不需要为每个请求都创建一个新的连接了。这里需要注意的是,虽然共用了同一个连接,但是每个请求仍然会创建一个新的swoole_client实例,只是这些实例底层会复用同一个TCP连接。因此,如果开启了SWOOLE_KEEP选项也就不能随便调用close关闭客户端,并且在使用时可使用isConnect方法来判断连接是否可用。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon