用workerman寫好了服務(wù)端的程序,現(xiàn)在用PHP寫了個測試程序,模擬多個用戶同時訪問服務(wù)端,測試服務(wù)器的處理能力,代碼如下:
<?php
class Client {
private $lastSendTime = 0;
private $SEND_INTERVAL = 60;
private $socket;
private static $global_id = 0;
private static $host;
private static $port;
private $id;
public function __construct($host, $port) {
self::$host = $host;
self::$port = $port;
self::$global_id ++;
$this->id = self::$global_id;
$this->lastSendTime = mt_rand(time() - $this->SEND_INTERVAL * 2, time() - $this->SEND_INTERVAL);
}
public function connect() {
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($this->socket) {
if (socket_connect($this->socket, self::$host, self::$port) && socket_set_nonblock($this->socket)) {
return TRUE;
}
}
$errno = socket_last_error($this->socket);
$errstr = socket_strerror($errno);
echo 'Client connect failed..' . PHP_EOL . $errno . ': ' . $errstr . PHP_EOL;
socket_close($this->socket);
return FALSE;
}
public function sendCommand($command) {
$now = time();
if ($now - $this->lastSendTime > $this->SEND_INTERVAL) {
if (socket_write($this->socket, $command)) {
//echo 'Client ' . $this->id . ' send message successfully' . PHP_EOL;
$this->lastSendTime = $now;
}
else {
$errno = socket_last_error($this->socket);
$errstr = socket_strerror($errno);
if ($errno == 10054 || $errno == 10053) {
echo 'Client ' . $this->id . ' connect again' . PHP_EOL;
socket_close($this->socket);
$this->connect();
}
else {
echo 'Client send message failed' . PHP_EOL;
echo $errno . ': ' . $errstr . PHP_EOL;
}
}
}
}
}
if (count($argv) != 2) {
exit('1 param is required.');
}
$port = 4832;
$host = 'xxxx.xxxx.xxx.xxx';
$total = (int) $argv;
$clients = [];
$command = 'XXx';
$stat = 0;
for ($i = 0; $i < $total; $i++) {
$c = new Client($host, $port);
if ($c->connect()) {
echo (++$stat) . ' clients connected' . PHP_EOL;
$clients[] = $c;
$c->sendCommand($command);
}
}
echo count($clients) . ' Clients are connected.' . PHP_EOL;
while (true) {
foreach ($clients as $c) {
$c->sendCommand($command);
}
sleep(1);
//echo memory_get_usage(true) . PHP_EOL;
}
在windows下用cmd(命令行模式)來運(yùn)行,發(fā)現(xiàn)一段時間后,系統(tǒng)的已使用內(nèi)存越來越高,把程序結(jié)束后,內(nèi)存占用馬上恢復(fù)到原來的水平。但是我在程序中使用memory_get_usage方法來檢查進(jìn)程占用的內(nèi)存時,卻發(fā)現(xiàn)長時間都是不變的,在任務(wù)管理器中查看進(jìn)程占用內(nèi)存時,也是不變的。我想長時間運(yùn)行測試程序,以檢查服務(wù)端的穩(wěn)定性,但是大概運(yùn)行一天后,內(nèi)存就不夠用了。就教大神,我的內(nèi)存到底去哪里了??
我現(xiàn)在懷疑是不是我的程序沒有讀取服務(wù)器返回的數(shù)據(jù),導(dǎo)致數(shù)據(jù)都堆積到內(nèi)存了?但是我并不關(guān)心服務(wù)器的回復(fù)信息,而且我用的是非阻塞模式,要讀取回復(fù)信息好像挺麻煩的。如果果真是這個原因,有什么辦法讓程序直接丟棄服務(wù)的回復(fù)信息?