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

GateWay 獲取無法穩(wěn)定獲取靜態(tài)成員值

daling

在Event.php中新增了一個靜態(tài)成員,然后在onWorkerStart回調(diào)中,設(shè)置在$businessWorker->id == 0進(jìn)程中異步打開一個TCP,并將接受的數(shù)據(jù)處理后循環(huán)賦值更新靜態(tài)成員,并在onMessage回調(diào)中隨時取該靜態(tài)成員值,卻發(fā)現(xiàn)無法穩(wěn)定獲取,時而獲取值為空,時而獲取值正常。
經(jīng)測試,如果在onWorkerStart回調(diào)中給該靜態(tài)成員循環(huán)加1,其值實可以一直正常步進(jìn)的,但是換成循環(huán)賦值數(shù)組變量,就不穩(wěn)定了,時有時無。大概是什么方面的問題?,對變量內(nèi)存大小有限制嗎?還是因為變量常駐內(nèi)存,而循環(huán)更新值時造成內(nèi)存溢出?

class Events
{
    public static $tcp_data = array(); 
    public static $int_data = 1;

    public static function onWorkerStart($businessWorker) {
        if ($businessWorker->id == 0) {
            //創(chuàng)建異步TCP ,獲取TCP數(shù)據(jù)流
            $tcp_connection = new AsyncTcpConnection("tcp://110.110.110.110:110");
            $tcp_connection->onConnect = function($tcp_connection){
                $tcp_connection->send('get_data\n');
            };
            $tcp_connection->onMessage = function($tcp_connection, $data){

                self::$tcp_data = $data;//有消息就重新賦值,在onMessage時有時無
                self::$int_data++; //有消息就步進(jìn)加1 在onMessage可以正常得到結(jié)果

            }
        }
    }

    public static function onConnect($client_id) {
    }

   public static function onMessage($client_id, $message) {
        var_dump(self::$tcp_data);  //時而正常取值,時而為NULL,大多數(shù)情況為NULL
        var_dump(self::$int_data);  //一直正常輸出
   }

   public static function onClose($client_id) {
   }
}
3102 5 0
5個回答

walkor 打賞

onWorkerStart那里設(shè)置完$tcp_connection的各種回調(diào)后要加一個$tcp_connection->connect();不然不會發(fā)出異步鏈接,也不會觸發(fā)$tcp_connection->onMessage。

另外GatewayWorker是多進(jìn)程的,你的代碼只在0號進(jìn)程設(shè)置了異步鏈接,只有0號進(jìn)程靜態(tài)變量會有數(shù)據(jù),其它進(jìn)程靜態(tài)變量沒數(shù)據(jù)。如果客戶端請求被分配到其它進(jìn)程也會導(dǎo)致沒有數(shù)據(jù)。

其實這種問題多echo var_dump下其實就出來了,可能self::$tcp_data = $data; 中的$data就是null

  • 暫無評論
daling

謝謝!

有$tcp_connection->connect();,忘貼上去了;
$data數(shù)據(jù)始終是有的,而且這個異步連接的onMessage消息回調(diào)比較高頻,每秒鐘可能會被回調(diào)幾十次,數(shù)據(jù)不會為空;
如果在進(jìn)程ID0里面異步連接,其他進(jìn)程無法獲取不到該數(shù)據(jù)的話,有沒有解決的辦法,即所有進(jìn)程都能讀取到進(jìn)程ID0的異步鏈接回調(diào)數(shù)據(jù)?(無法每個進(jìn)程都打開相同的異步鏈接,有限制;也不能只開一個work進(jìn)程)

因為數(shù)據(jù)比較高頻,我想查看看回調(diào)的處理效率及沒來得及回調(diào)的數(shù)據(jù)存放在哪個系統(tǒng)哪個地方,有無辦法可以查看隊列/數(shù)據(jù)長短?

  • 暫無評論
walkor 打賞

異步鏈接獲取數(shù)據(jù)后放到redis等存儲中,onMesage里直接讀存儲。
處理頻率可以自己打印日志。沒有隊列。

  • 暫無評論
daling

我預(yù)計現(xiàn)在的處理效率已經(jīng)低于對端TCP數(shù)據(jù)的發(fā)送頻率,本機(jī)緩沖占滿,沒法接受新的TCP數(shù)據(jù),造成數(shù)據(jù)丟失,在這一塊,有什么方法可以調(diào)試嗎?還是概念有錯,TCP不會丟數(shù)據(jù)?

  • 暫無評論
walkor 打賞

只要連接不斷開,TCP不會丟數(shù)據(jù)

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