记录一下 while(true)的有趣事情
public function crontab(){
while(true){
file_put_contents(storage_path("crontab.log"),date('Y-m-d H:i:s').PHP_EOL,FILE_APPEND);
sleep(1);//秒级任务
//... 添加逻辑
}
}
当你第一次访问这个crontab方法时,while(true)的循环逻辑就成了常驻进程,每一秒钟插入一次数据。
那怎么手动停止呢?
1、一开始我尝试从代码入手,加了exit断点,甚至把代码注释掉,它还是在运行。说明该进程脱离代码层面了。
2、然后我尝试,service php-fpm restart,重启php,无果,我很纳闷;
3、最后我又尝试,service apache2 restart ,有果,程序停止输出;
但是为什么重启php进程不行呢?
也许需要手动kill 杀死进程吧。。。。。
结论:while(true) 一旦执行就成了进程停不下来了,除非你添加逻辑里有break,或者重启服务器才能阻止它。
附加:
1、一般程序是不允许while(true)多次执行的,所以就需要文件锁去阻止。像一些实时获取数据的,可能就会用到while(true)
public function crontab(){
$temp_file = storage_path('queue.lock'); //检查是否断开
if(file_exists($temp_file)){
return false;
}
file_put_contents($temp_file,"lock");
while(true){
file_put_contents(storage_path("crontab.log"),date('Y-m-d H:i:s').PHP_EOL,FILE_APPEND);
sleep(1);//秒级任务
//... 添加逻辑。带有break;不然停不下来了。
}
if(file_exists($temp_file)){
unlink($temp_file);
}
}
如上图所示,这样就成功实现阻止程序多次运行while(true)的目的了。
2、如果用任务计划访问接口,就是分钟级的了
比如:每分钟访问一次路由接口:
* * * * * curl http://192.168.150.144/sendemail