记录解决crontab不能定时执行php的原因
最近开发了一个给手机客户端推送消息的功能,需求是客户端对用户进行关注后,被关注的人登录的移动设备便会收到推送的提醒消息,增加用户黏度。
本着异步发送请求,关注用户后,不立即调用第三方推送平台的接口,而是将任务放入到消息列队中,由其他进程完成推送。这样客户端的关注动作也会及时得到相应。这时想起来crontab的任务计划。
想着用户操作关注动作之后,信息提示发送延迟不超过3秒。便在网上查阅资料,找找crontab的任务计划详解,发现没有按秒执行的任务。网上提供了另外一种思路:写一个shell script,里面有一个循环,执行20次,每次暂停3秒钟。然后crontab的命令每分钟执行shell script。
按照这种思路写好了shell script和crontab。发现点击关注用户操作后,线上数据库并没有改动。排查了很多方面的问题,包括shell script、crontab权限等等。最终把问题锁定到shell脚本中php的执行语句
语句如下:
php -f /data/wwwroot/default_push.php
没有执行成功。如果换了shell向文件的输出语句,语句定时写入到文本文件中。所以排除了shell script语法错误和crontab没有执行的原因。
便在网上找解决方案:
网上有些文章提示了php环境变量的事,我按照网络上提示的一一排查,包括shell的执行权限,变量名之类的。最终确定到php -r /data/wwwroot/default_push.php的问题。将这一行替换成
/usr/local/php/bin/php /data/wwwroot/default_push.php
然后执行成功了!!!!!果然是环境变量的事情。
前面补充上php命令的完整路径。
就好了
深夜完成,特此记录。困扰了我好几天的问题。