php while(true) 代替crontab达到秒级定时

记录一下 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值