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