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

關(guān)于send發(fā)送長消息體后續(xù)send無效的問題。

cfz87862529

我在測試workerman時(shí)下了如下的簡單測試代碼:

public function workerOnMessage($connection, $data)
    {
        $ip = $connection->getRemoteIp();
        if ($ip == '127.0.0.1') {
            $data = str_replace('\\"', '"', str_replace('\r\n', '', $data));
            $data = ltrim($data, '"');
            $data = rtrim($data, '"');
        }
        if ($data == '@') { //判斷數(shù)據(jù)是不是@,作為心跳包
            $connection->send('@');
        }

        if($data == '1'){
            $str1 = "1111111111111111111111111111111111111111111111111111111111111111111";
            for($i = 0; $i < 10000000; $i++){
                $str1 .= '*';
            }
            $str2 = "2222222222";
            $str3 = "3";
            $connection->send($str2);
            $connection->send($str1);
            $connection->send($str3);
        }
    }

發(fā)現(xiàn)在客戶端的情況如下:
$str2接收到,$str1接收到,但是$str3沒接收到,這個(gè)是個(gè)什么問題?

4109 1 0
1個(gè)回答

walkor 打賞

workerman有內(nèi)存保護(hù)機(jī)制,例如向客戶端發(fā)送(尤其是廣播)大數(shù)據(jù)時(shí),由于客戶端接收速度或者帶寬問題,客戶端不會立刻接收到所有數(shù)據(jù)。那么這些未發(fā)送完的數(shù)據(jù)就要緩沖在服務(wù)器內(nèi)存里。例如向1000個(gè)客戶端瞬間廣播10M的數(shù)據(jù),那么最壞的情況在內(nèi)存瞬間可能要緩沖10G的數(shù)據(jù),服務(wù)器內(nèi)存就爆掉了。所以workerman有一個(gè)發(fā)送緩沖區(qū)的限制,默認(rèn)是每個(gè)客戶端1M的緩沖區(qū),可以通過http://doc.workerman.net/315342 更改。如果超過這個(gè)限制,會觸發(fā)http://doc.workerman.net/315150回調(diào),在這個(gè)回調(diào)里開發(fā)者可以做一些處理比如停止后續(xù)發(fā)送等。如果onBufferFull回調(diào)觸發(fā)后,服務(wù)端仍然發(fā)送數(shù)據(jù)并且緩沖區(qū)仍然是滿的,會觸發(fā)onError回調(diào),并丟棄數(shù)據(jù)。

通過你的代碼看到是服務(wù)端瞬間發(fā)送約10M的數(shù)據(jù),對應(yīng)客戶端發(fā)送緩沖區(qū)會被填滿,導(dǎo)致后面的數(shù)據(jù)被丟棄,所以后面的數(shù)據(jù)可能收不到。
解決辦法
1、不要發(fā)送這么大的數(shù)據(jù)。
2、監(jiān)聽onBufferFull事件,對方緩沖區(qū)滿了就不要發(fā)了

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