在Event.php中新增了一个静态成员,然后在onWorkerStart回调中,设置在$businessWorker->id == 0进程中异步打开一个TCP,并将接受的数据处理后循环赋值更新静态成员,并在onMessage回调中随时取该静态成员值,却发现无法稳定获取,时而获取值为空,时而获取值正常。
经测试,如果在onWorkerStart回调中给该静态成员循环加1,其值实可以一直正常步进的,但是换成循环赋值数组变量,就不稳定了,时有时无。大概是什么方面的问题?,对变量内存大小有限制吗?还是因为变量常驻内存,而循环更新值时造成内存溢出?
class Events
{
public static $tcp_data = array();
public static $int_data = 1;
public static function onWorkerStart($businessWorker) {
if ($businessWorker->id == 0) {
//创建异步TCP ,获取TCP数据流
$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++; //有消息就步进加1 在onMessage可以正常得到结果
}
}
}
public static function onConnect($client_id) {
}
public static function onMessage($client_id, $message) {
var_dump(self::$tcp_data); //时而正常取值,时而为NULL,大多数情况为NULL
var_dump(self::$int_data); //一直正常输出
}
public static function onClose($client_id) {
}
}
onWorkerStart那里设置完$tcp_connection的各种回调后要加一个$tcp_connection->connect();不然不会发出异步链接,也不会触发$tcp_connection->onMessage。
另外GatewayWorker是多进程的,你的代码只在0号进程设置了异步链接,只有0号进程静态变量会有数据,其它进程静态变量没数据。如果客户端请求被分配到其它进程也会导致没有数据。
其实这种问题多echo var_dump下其实就出来了,可能self::$tcp_data = $data; 中的$data就是null
谢谢!
有$tcp_connection->connect();,忘贴上去了;
$data数据始终是有的,而且这个异步连接的onMessage消息回调比较高频,每秒钟可能会被回调几十次,数据不会为空;
如果在进程ID0里面异步连接,其他进程无法获取不到该数据的话,有没有解决的办法,即所有进程都能读取到进程ID0的异步链接回调数据?(无法每个进程都打开相同的异步链接,有限制;也不能只开一个work进程)
因为数据比较高频,我想查看看回调的处理效率及没来得及回调的数据存放在哪个系统哪个地方,有无办法可以查看队列/数据长短?
异步链接获取数据后放到redis等存储中,onMesage里直接读存储。
处理频率可以自己打印日志。没有队列。
我预计现在的处理效率已经低于对端TCP数据的发送频率,本机缓冲占满,没法接受新的TCP数据,造成数据丢失,在这一块,有什么方法可以调试吗?还是概念有错,TCP不会丢数据?
只要连接不断开,TCP不会丢数据