前面都是解决问题的过程,如果只需要最终解决方案可直接跳到本文最下方。
前段时间需要做个带有每日积分转换代金券的项目,其核心功能是每日定时将所有用户的积分按比例转换成代金券额。本来不是什么难事,swoole、CronTab等一堆解决方案,但客户用的是非自有服务器(即虚拟主机,由服务器商托管,无远程桌面,无php.ini修改权限,只有FTP),所以只能通过纯PHP代码来实现。
最开始网上找的方案是用pcntl_alarm()函数,但虚拟主机本身环境不支持pcntl扩展,也没有新的扩展权限,只能继续再找。
然后找到有用while()+sleep()的方式,具体代码如下:
ignore_user_abort();//关掉浏览器后脚本继续执行
set_time_limit(0);//设置脚本执行时间无上限
ini_set('memory_limit','512M');//内存限制设置
$interval_time = 10;//间隔为10秒
do{
/*
*业务逻辑
*/
sleep($interval_time);//程序暂时睡眠
}while(true);
初期测试并没有什么问题,但时间一长就有很大概率程序中断,不能持续稳定的执行定时显然不行。
在参考过一些网上资料与本地调试后,找到一个相较于前一个方法稳定的方式,使用采集函数file_get_contents()代替while()循环,具体代码如下:
ignore_user_abort();//关掉浏览器后脚本继续执行
set_time_limit(0);//设置脚本执行时间无上限
ini_set('memory_limit','512M');//内存限