以下的代码,我写在onworkerstart里面,每隔10秒中向redis的队列写数据,但是为啥while(true)的部分没有执行呢?如果去掉while(true),那只能执行1次,不能执行多次?
protected function loop()
{
Timer::add(10, function () {
$data['DEVICE_ID'] = '567';
$data['ADDRESS'] = '01';
$data['MODEL_ID'] = "567";
$data['OPERATE'] = "1";
$data['DATA']['ONOFF'] = "1";
$data['DATA']['TEMPERATURE'] = "20";
$data['DATA']['MODEL'] = "0001";
$data['DATA']['FAN'] = "0000";
Redis::LPUSH(env('REDIS_AIRCONTROL_QUEUE'), json_encode($data));
});
while (true) {
$data = Redis::RPOP(env('REDIS_AIRCONTROL_QUEUE'));
if ($data) {
$this->dealWith($data);
}
}
}
我在论坛上搜索了很多帖子,但是都没有我这种情况
while(1)是不是会导致阻塞,让workerman框架拿不到控制权。
很有可能。
但是我的例子正好相反,是Timer::add部分执行了,但是while(1)部分不执行,所以这是为啥呢?
不是很有可能,就是的。这里的while等于把整个进程死循环阻塞了。time里面的函数是执行不成功的
你所谓的没有执行是指没有Redis:PROP到数据的话,那就是满足我刚才说的逻辑。因为timer没有执行,所以redis操作不到数据。你就可以试着在while里面echo 1;正常情况下是会一直输出1
他是执行了while,只是没有PROP到数据让你感到错觉是while没有执行。实际在while中echo 1;验证我说的
你这是loop啊,执行几次?
onworkerstart 函数里写的什么?