__construct 方法
void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)
創(chuàng)建一個(gè)異步連接對(duì)象。
AsyncTcpConnection可以讓W(xué)orkerman作為客戶端向遠(yuǎn)程服務(wù)端發(fā)起異步連接,并通過(guò)send接口和onMessage回調(diào)異步發(fā)送和處理連接上的數(shù)據(jù)。
參數(shù)
參數(shù):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
參數(shù):$context_option
此參數(shù)要求(workerman >= 3.3.5)
用來(lái)設(shè)置socket上下文,例如利用bindto
設(shè)置以哪個(gè)(網(wǎng)卡)ip和端口訪問(wèn)外部網(wǎng)絡(luò),設(shè)置ssl證書等。
參考 stream_context_create、 套接字上下文選項(xiàng)、SSL 上下文選項(xiàng)
注意
目前AsyncTcpConnection支持的協(xié)議有tcp、ssl、ws、frame、text。
同時(shí)支持自定義協(xié)議,參見如何自定義協(xié)議
其中ssl要求Workerman>=3.3.4,并安裝openssl擴(kuò)展。
目前不支持http協(xié)議的AsyncTcpConnection。
可以用new AsyncTcpConnection('ws://...')
像瀏覽器一樣在workerman里發(fā)起websocket連接遠(yuǎn)程websocket服務(wù)器,見示例。但是不能以 new AsyncTcpConnection('websocket://...')
的形式在workerman里發(fā)起websocket連接。
示例
示例 1、異步訪問(wèn)外部http服務(wù)
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
// 進(jìn)程啟動(dòng)時(shí)異步建立一個(gè)到www.baidu.com連接對(duì)象,并發(fā)送數(shù)據(jù)獲取數(shù)據(jù)
$task->onWorkerStart = function($task)
{
// 不支持直接指定http,但是可以用tcp模擬http協(xié)議發(fā)送數(shù)據(jù)
$connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
// 當(dāng)連接建立成功時(shí),發(fā)送http請(qǐng)求數(shù)據(jù)
$connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
{
echo "connect success\n";
$connection_to_baidu->send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: keep-alive\r\n\r\n");
};
$connection_to_baidu->onMessage = function(AsyncTcpConnection $connection_to_baidu, $http_buffer)
{
echo $http_buffer;
};
$connection_to_baidu->onClose = function(AsyncTcpConnection $connection_to_baidu)
{
echo "connection closed\n";
};
$connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
{
echo "Error code:$code msg:$msg\n";
};
$connection_to_baidu->connect();
};
// 運(yùn)行worker
Worker::runAll();
示例 2、異步訪問(wèn)外部websocket服務(wù),并設(shè)置以哪個(gè)本地ip及端口訪問(wèn)
<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function($worker) {
// 如果你想只在一個(gè)進(jìn)程里發(fā)起連接,可以通過(guò)判斷$worker->id來(lái)做到,例如下面是只在0號(hào)進(jìn)程發(fā)起連接
if ($worker->id != 0) {
return;
}
// 設(shè)置訪問(wèn)對(duì)方主機(jī)的本地ip及端口(每個(gè)socket連接都會(huì)占用一個(gè)本地端口)
$context_option = array(
'socket' => array(
// ip必須是本機(jī)網(wǎng)卡ip,并且能訪問(wèn)對(duì)方主機(jī),否則無(wú)效
'bindto' => '114.215.84.87:2333',
),
);
$con = new AsyncTcpConnection('ws://echo.websocket.org:80', $context_option);
$con->onConnect = function(AsyncTcpConnection $con) {
$con->send('hello');
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
echo $data;
};
$con->connect();
};
Worker::runAll();
示例 3、異步訪問(wèn)外部wss端口,并設(shè)置本地ssl證書
<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function($worker){
// 設(shè)置訪問(wèn)對(duì)方主機(jī)的本地ip及端口以及ssl證書
$context_option = array(
'socket' => array(
// ip必須是本機(jī)網(wǎng)卡ip,并且能訪問(wèn)對(duì)方主機(jī),否則無(wú)效
'bindto' => '114.215.84.87:2333',
),
// ssl選項(xiàng),參考https://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 本地證書路徑。 必須是 PEM 格式,并且包含本地的證書及私鑰。
'local_cert' => '/your/path/to/pemfile',
// local_cert 文件的密碼。
'passphrase' => 'your_pem_passphrase',
// 是否允許自簽名證書。
'allow_self_signed' => true,
// 是否需要驗(yàn)證 SSL 證書。
'verify_peer' => false
)
);
// 發(fā)起異步連接
$con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);
// 設(shè)置以ssl加密方式訪問(wèn)
$con->transport = 'ssl';
$con->onConnect = function(AsyncTcpConnection $con) {
$con->send('hello');
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
echo $data;
};
$con->connect();
};
Worker::runAll();