require __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
use Workerman\Connection\AsyncTcpConnection;
$worker = new Worker();
$worker->onWorkerStart = 'connect';
function connect(){
static $count = 0;
echo $count . "\n";
if ($count++ >= 10000) return;
// 建立異步鏈接
$con = new AsyncTcpConnection('ws://127.0.0.1:7272');
$con->onConnect = function($con) {
// 遞歸調(diào)用connect
connect();
};
$con->onMessage = function($con, $msg) {
$msgInfo = json_decode($msg, true);
if(isset($msgInfo['type']) && $msgInfo['type'] == 'ping'){
$con->send('{"type":"pong"}');
}
echo "r $msg\n";
};
$con->onClose = function($con) {
echo "con close\n";
};
Timer::add(5, function()use($con){
$con->send('{"type":"pong"}');
});
$con->connect();
echo $count, " connections complete\n";
}
Worker::runAll();
這個(gè)是如何測(cè)試的???先在自己服務(wù)器下 start了,發(fā)現(xiàn)就跑一遍啊。。。真是個(gè)小白,求解答
7272端口對(duì)應(yīng)的服務(wù)啟動(dòng)成功了嗎? 連接姿勢(shì)正確了嗎? 從代碼上看似乎只有一種解釋就是:
tcp連接并沒(méi)有建立成功,導(dǎo)致后續(xù)無(wú)法遞歸調(diào)用connect(),所以看上去只跑了一遍,而且還是無(wú)效的TCP通信。
其實(shí)我壓根就沒(méi)整明白,這個(gè)測(cè)試文件是在什么基礎(chǔ)上運(yùn)行的。我是先在命令行開(kāi)start.php嗎?是開(kāi)守護(hù)嗎?還是不用開(kāi)start.php,直接php 這個(gè)測(cè)試文件啊。。
1、假如7272端口對(duì)應(yīng)的啟動(dòng)服務(wù)腳本為 start1.php , 那么先啟動(dòng): php start1.php start
2、假如壓測(cè)啟動(dòng)腳本為start2.php【就是你上面貼的這個(gè)代碼】,那么繼續(xù)啟動(dòng):php start2.php start
完事兒~~
tcp root ChatGateway websocket://0.0.0.0:7272 4 已經(jīng)開(kāi)啟了
再
php test.php start
沒(méi)反應(yīng)了。。。
php start.php start -d
開(kāi)啟成功后
php test.php start
這樣開(kāi)始跑了
count我設(shè)置的是10000
但跑到1022 就不動(dòng)了,這崩了嗎
1、這不是崩了哈,
2、逆推出使用的是默認(rèn)select事件機(jī)制【自己php start.php status確認(rèn)下】,select 最大只支持1024個(gè)連接,按照手冊(cè)優(yōu)化linux內(nèi)核,然后安裝event擴(kuò)展,缺一不可,看手冊(cè)很重要。