tcp長連接程序,里面啟動(dòng)了一個(gè)Text協(xié)議的內(nèi)部端口程序,執(zhí)行 php think start 報(bào)錯(cuò),提示 內(nèi)部端口 Address already in use
Worker::$pidFile = '/var/run/workerman_relay.pid';
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// 啟動(dòng)4個(gè)進(jìn)程對外提供服務(wù)
$tcp_worker->count = 4;
//---------------------------------- onWorkerStart start ---------------------------
$tcp_worker->onWorkerStart = function($tcp_worker) {
Timer::add(10, function () use ($tcp_worker) {
$time_now = time();
foreach ($tcp_worker->connections as $connection) {
// 有可能該connection還沒收到過消息,則lastMessageTime設(shè)置為當(dāng)前時(shí)間
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 上次通訊時(shí)間間隔大于心跳間隔,則認(rèn)為客戶端已經(jīng)下線,關(guān)閉連接
if ($time_now - $connection->lastMessageTime > Relay::$heartbeat_time){
$connection->close();
}
}
});
// 開啟一個(gè)內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
$inner_text_worker = new Worker('Text://0.0.0.0:5332');
$inner_text_worker->onMessage = function ($connection, $buffer) use ($tcp_worker) {
// $data數(shù)組格式,里面有uid,表示向那個(gè)uid的頁面推送數(shù)據(jù)
$data = json_decode($buffer, true);
$uid = $data['padCode'];
// 通過workerman,向uid的頁面推送數(shù)據(jù)
$ret = Relay::sendMessageByUid($tcp_worker,$uid, json_encode($data['param']));
dump($data);
return $connection->send(json_encode(['padCode'=>$uid,'status'=> (bool)$ret]));
};
$inner_text_worker->listen();
};
Worker::runAll();
stream_socket_server(): unable to connect to tcp://0.0.0.0:5332 (Address already in use)
已解決
$tcp_worker->count = 4 的問題,每個(gè)進(jìn)程就是一個(gè)端口啟動(dòng),4個(gè)就是啟動(dòng)了4次端口,所以提示占用
進(jìn)程數(shù)設(shè)置為1或者設(shè)置$inner_text_worker->resuePort = true;
,reusePort作用參見手冊 http://m.wtbis.cn/doc/workerman/worker/reuse-port.html
另外如果開啟多進(jìn)程,進(jìn)程間是完全隔離的,比如客戶端1連接了A進(jìn)程,客戶端2連接了B進(jìn)程,A進(jìn)程沒辦法直接獲取B進(jìn)程的連接數(shù)據(jù),也就是客戶端1和客戶端2之間沒辦法直接通訊。要通訊的話需要做進(jìn)程間通訊,例如用channel組件等方案。如果沒有多進(jìn)程編程經(jīng)驗(yàn),建議直接開1個(gè)進(jìn)程,或者用gatewayWorker。
如果workerman只做通訊,沒有數(shù)據(jù)庫等阻塞訪問,開一個(gè)進(jìn)程就可以支持幾萬連接,一般業(yè)務(wù)夠用了。