workerman中需用asynctcpconnection实现非阻塞tcp连接:先引入类,再以tcp://格式实例化,注册onconnect后调connect();ssl连接支持ssl://前缀或配置verify_peer;onmessage中需手动解析http响应,避免直接json_decode未完整数据。

Workerman项目需要主动连接外部HTTP API、数据库或第三方TCP服务时,不能用传统curl或PDO阻塞式调用,否则会卡住整个事件循环——必须用AsyncTcpConnection发起非阻塞连接。
创建基础异步TCP连接
第一步:引入AsyncTcpConnection类,指定目标地址和端口。
use Workerman\Connection\AsyncTcpConnection;
第二步:实例化连接对象,地址格式必须为tcp://host:port,不能省略协议前缀。
$conn = new AsyncTcpConnection('tcp://api.example.com:8080');
第三步:注册onConnect回调,连接成功后才能发送数据——【未触发onConnect就调send()会导致数据丢失】。
$conn->onConnect = function ($connection) { $connection->send("GET /health HTTP/1.1\r\nHost: api.example.com\r\n\r\n"); };
第四步:调用connect()真正发起连接,这一步不会阻塞主线程。
$conn->connect();
处理SSL加密连接
方法一:直接使用ssl://协议前缀
$sslConn = new AsyncTcpConnection('ssl://api.secure.com:443');
方法二:传入上下文参数控制证书验证行为,生产环境必须启用verify_peer,开发调试可临时关闭。
$sslConn = new AsyncTcpConnection('ssl://api.secure.com:443', [ 'ssl' => [ 'verify_peer' => true, 'cafile' => '/path/to/cacert.pem' ] ])
注意:若服务端使用自签名证书且verify_peer设为true,连接会直接失败并触发onError,此时需配合allow_self_signed => true才可能建立连接(但存在中间人风险)。
接收响应并解析
在onMessage回调中处理返回数据,注意HTTP响应头与正文以双换行分隔,需手动拆解。
$conn->onMessage = function ($connection, $data) { $parts = explode("\r\n\r\n", $data, 2); $headers = $parts[0] ?? ''; $body = $parts[1] ?? ''; echo "Status: " . (preg_match('/HTTP\/\d+\.\d+ (\d+)/', $headers, $m) ? $m[1] : 'unknown') . "\n"; echo "Body length: " . strlen($body) . "\n"; };
如果对方返回的是JSON,【不能直接json_decode($data)】,因为$data可能只包含响应片段(如分块传输),必须等onClose触发后再合并完整数据,或自行实现缓冲逻辑。
$conn->onClose = function ($connection) { echo "Connection closed.\n"; };











