国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

php socket內(nèi)存泄漏?

wudihzh

用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)存到底去哪里了??

5945 3 0
3個回答

wudihzh

我現(xiàn)在懷疑是不是我的程序沒有讀取服務(wù)器返回的數(shù)據(jù),導(dǎo)致數(shù)據(jù)都堆積到內(nèi)存了?但是我并不關(guān)心服務(wù)器的回復(fù)信息,而且我用的是非阻塞模式,要讀取回復(fù)信息好像挺麻煩的。如果果真是這個原因,有什么辦法讓程序直接丟棄服務(wù)的回復(fù)信息?

  • 暫無評論
walkor 打賞

客戶端必須讀數(shù)據(jù),不然數(shù)據(jù)都會積壓在每個socket連接的讀緩沖區(qū),導(dǎo)致內(nèi)存不斷增長。如果每個連接的socket讀緩沖區(qū)都滿了,則客戶端無法再接收到數(shù)據(jù)

  • wudihzh 2015-03-13

    嗯嗯,測試過了,確實(shí)是這樣,感謝~~

mazhaozi

這也是我一直的疑問

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??