問(wèn)題的提出:
昨天用腳本模擬客戶端登陸在線。 使用C語(yǔ)言發(fā)送cjson等登陸以及ping/pong包。。服務(wù)器定義了每10秒會(huì)發(fā)一個(gè)ping包心跳。 然后使用腳本每秒循環(huán)一次調(diào)用這個(gè)客戶端, 一共循環(huán)2000次。
發(fā)現(xiàn)在線的客戶端到達(dá)2000左右, 經(jīng)常會(huì)出現(xiàn)某些終端自動(dòng)離線或者因?yàn)樾奶瑫r(shí)被服務(wù)器踢掉的情況。
使用的是text的連接.
客戶端腳本:
#!/bin/bash
clear
rm test.log
for((i=0;i<5000;i++))
do
echo $i >> ./test.log
./tcpclient 192.168.1.112 8282 1233 87987987 &
sleep 1
done
tcpclient主要做的就是發(fā)送json格式的pong回復(fù)..
不知道是不是我的客戶端有問(wèn)題.. 如果能夠直接用workman測(cè)試, 排除不必要的干擾, 就最好了
可以用workerman來(lái)測(cè)試,排除客戶端問(wèn)題的干擾,以下是測(cè)試的demo。
127.0.0.1:8282 改成實(shí)際服務(wù)器ip和端口。
demo是text協(xié)議,如果是ws協(xié)議,就把text://127.0.0.1:8282改成ws://127.0.0.1:8282。
<?php
require __DIR__ . '/../Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
use Workerman\Connection\AsyncTcpConnection;
$worker = new Worker();
$worker->onWorkerStart = 'connect';
function connect(){
static $count = 0;
// 2000個(gè)鏈接
if ($count++ >= 2000) return;
// 建立異步鏈接
$con = new AsyncTcpConnection('text://127.0.0.1:8282');
$con->onConnect = function($con) {
// 遞歸調(diào)用connect
connect();
};
$con->onMessage = function($con, $msg) {
echo "recv $msg\n";
};
$con->onClose = function($con) {
echo "con close\n";
};
// 當(dāng)前鏈接每55秒發(fā)個(gè)心跳包
Timer::add(55, function()use($con){
$con->send("ping");
});
$con->connect();
echo $count, " connections complete\n";
}
Worker::runAll();
$con = new AsyncTcpConnection('text://127.0.0.1:8282');
下面加一句
$con->transport = 'ssl';
手冊(cè):http://doc.workerman.net/315300