__construct 方法

  1. void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)

创建一个异步连接对象。

AsyncTcpConnection可以让Workerman作为客户端向远程服务端发起异步连接,并通过send接口和onMessage回调异步发送和处理连接上的数据。

参数

参数:remote_address

连接的地址,例如 tcp://www.baidu.com:80 ssl://www.baidu.com:443 ws://echo.websocket.org:80 frame://192.168.1.1:8080 text://192.168.1.1:8080

参数:$context_option

此参数要求(workerman >= 3.3.5)

用来设置socket上下文,例如利用bindto设置以哪个(网卡)ip和端口访问外部网络,设置ssl证书等。

参考 stream_context_create套接字上下文选项SSL 上下文选项

注意

目前AsyncTcpConnection支持的协议有tcpsslwsframetext

同时支持自定义协议,参见如何自定义协议

其中ssl要求Workerman>=3.3.4,并安装openssl扩展

目前不支持http协议的AsyncTcpConnection。

可以用new AsyncTcpConnection('ws://...')像浏览器一样在workerman里发起websocket连接远程websocket服务器,见示例。但是不能以 new AsyncTcpConnection('websocket://...')的形式在workerman里发起websocket连接。

示例

示例 1、异步访问外部http服务

  1. use Workerman\Worker;
  2. use Workerman\Connection\AsyncTcpConnection;
  3. use Workerman\Connection\TcpConnection;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $task = new Worker();
  6. // 进程启动时异步建立一个到www.baidu.com连接对象,并发送数据获取数据
  7. $task->onWorkerStart = function($task)
  8. {
  9. // 不支持直接指定http,但是可以用tcp模拟http协议发送数据
  10. $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
  11. // 当连接建立成功时,发送http请求数据
  12. $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
  13. {
  14. echo "connect success\n";
  15. $connection_to_baidu->send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: keep-alive\r\n\r\n");
  16. };
  17. $connection_to_baidu->onMessage = function(AsyncTcpConnection $connection_to_baidu, $http_buffer)
  18. {
  19. echo $http_buffer;
  20. };
  21. $connection_to_baidu->onClose = function(AsyncTcpConnection $connection_to_baidu)
  22. {
  23. echo "connection closed\n";
  24. };
  25. $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
  26. {
  27. echo "Error code:$code msg:$msg\n";
  28. };
  29. $connection_to_baidu->connect();
  30. };
  31. // 运行worker
  32. Worker::runAll();

示例 2、异步访问外部websocket服务,并设置以哪个本地ip及端口访问

  1. <?php
  2. use Workerman\Worker;
  3. use Workerman\Connection\AsyncTcpConnection;
  4. use Workerman\Connection\TcpConnection;
  5. require_once __DIR__ . '/vendor/autoload.php';
  6. $worker = new Worker();
  7. $worker->onWorkerStart = function($worker){
  8. // 设置访问对方主机的本地ip及端口(每个socket连接都会占用一个本地端口)
  9. $context_option = array(
  10. 'socket' => array(
  11. // ip必须是本机网卡ip,并且能访问对方主机,否则无效
  12. 'bindto' => '114.215.84.87:2333',
  13. ),
  14. );
  15. $con = new AsyncTcpConnection('ws://echo.websocket.org:80', $context_option);
  16. $con->onConnect = function(AsyncTcpConnection $con) {
  17. $con->send('hello');
  18. };
  19. $con->onMessage = function(AsyncTcpConnection $con, $data) {
  20. echo $data;
  21. };
  22. $con->connect();
  23. };
  24. Worker::runAll();

示例 3、异步访问外部wss端口,并设置本地ssl证书

  1. <?php
  2. use Workerman\Worker;
  3. use Workerman\Connection\AsyncTcpConnection;
  4. use Workerman\Connection\TcpConnection;
  5. require_once __DIR__ . '/vendor/autoload.php';
  6. $worker = new Worker();
  7. $worker->onWorkerStart = function($worker){
  8. // 设置访问对方主机的本地ip及端口以及ssl证书
  9. $context_option = array(
  10. 'socket' => array(
  11. // ip必须是本机网卡ip,并且能访问对方主机,否则无效
  12. 'bindto' => '114.215.84.87:2333',
  13. ),
  14. // ssl选项,参考https://php.net/manual/zh/context.ssl.php
  15. 'ssl' => array(
  16. // 本地证书路径。 必须是 PEM 格式,并且包含本地的证书及私钥。
  17. 'local_cert' => '/your/path/to/pemfile',
  18. // local_cert 文件的密码。
  19. 'passphrase' => 'your_pem_passphrase',
  20. // 是否允许自签名证书。
  21. 'allow_self_signed' => true,
  22. // 是否需要验证 SSL 证书。
  23. 'verify_peer' => false
  24. )
  25. );
  26. // 发起异步连接
  27. $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);
  28. // 设置以ssl加密方式访问
  29. $con->transport = 'ssl';
  30. $con->onConnect = function(AsyncTcpConnection $con) {
  31. $con->send('hello');
  32. };
  33. $con->onMessage = function(AsyncTcpConnection $con, $data) {
  34. echo $data;
  35. };
  36. $con->connect();
  37. };
  38. Worker::runAll();