一直用的是阿里云共享虚拟主机,挺稳定的管理界面UI也还可以,最近需要做一个定时执行的功能,需求是每天定时运行一段代码块。
一开始我想到的是用sleep()函数实现这个功能:
ignore_user_abort();//关掉浏览器后脚本继续执行
set_time_limit(0);//设置脚本执行时间无上限
do{
//需要执行的程序..
sleep(3600*24)
}while(true)
在本地mamp环境运行没问题,好,赶紧上传看看行不行,结果上传后运行程序发现一秒执行了n多次,调试半天后发现是阿里云虚机禁用了sleep()函数,尝试usleep()函数,结果还是被禁用了(谴责阿里云居然没有任何提示)。
后来花了几十块钱升级成了云独享主机,结果多了几个鸡肋的功能同时问题还没解决,这波血亏!
转念一想,那我不用休眠函数了,既然他一直执行,那就让他一直执行下去吧!程序一直判断时间,然后在确定的时间点执行
ignore_user_abort();//关掉浏览器后脚本继续执行
set_time_limit(0);//设置脚本执行时间无上限
$interval=3600*24;
$tagtime=time()+$interval;
do{
if(time()>$tagtime){ //如果当前时间戳大于目标时间的时间戳则执行
//需要执行的程序..
$tagtime+=$interval; //加上时间间隔,获得下一个目标时间的时间戳
}
}while(true)
结果第二天发现程序挂了,难道是阿里云把程序杀掉了或者php内存溢出吗,后来把间隔时间改为5分钟,改为60分钟乃至2小时程序都可以正常间隔运行,直到程序运行六个半小时以后自动被杀死,后来在上面的程序中加了flush()和ob_flush()函数清理php缓存还是没用,阿里云实锤了!我颓了
后来我脑洞大开,一个程序可以执行6h+,那我在这个程序结束前唤起另一个程序不就行了吗?也就是两个php文件相互唤醒,用header()函数+exit()函数,确实能成功唤醒,但是当我关闭浏览器时,两个程序都停止了,也就是ignore_user_abort()函数失效了,至此我彻底放弃了阿里云虚机,通过万能的小度小度,发现部分美国使用cPanel控制面板的虚机可以执行计划任务,遂放弃了阿里云,去新开了一个虚机,价格比阿里云便宜。
里面有Cron作业使用很方便,定时任务稳定准时,还有执行结果邮件通知功能,至此问题解决啦!再次感叹一下,店大欺客啊