事故背景
某 thinkphp6.x 项目运行时,偶尔出现异步队列执行失败的情况,实际调试时发现一切正常,但是异步队列就是会经常出现失败超时
调试来调试去,就是没有问题,怀疑执行的进程太多,抢占了任务??【为了加快速度,开了五个进程】,后面调试减少到一个进程,好像好了很多【心理安慰+999】
就这样相安无事了好几天,这个问题又出现!!!
再因为这个任务是支付确认的异步队列,要是订单没有办法确认的话,真的会凉凉的
排查过程中发现出现这个问题时候,手动断点调试是没有问题的,自动执行的话会提示订单查询失败。实际订单是肯定存在的
怀疑是更新出现缓存,删除缓存后重启队列,又正常运行了。但是更新是不可能出现什么缓存的,都是业务代码。后面想查询一下日志执行了什么SQL
发现一个root权限创建的日志文件,顿悟了。项目运行的权限是属于 www 的以 root 权限创建了日志之后,使用www权限运行的任务全部无法写入日志,埋下了一个巨坑。好像之前有处理过,又没有记录.......
注意事项
计划任务添加时必须指定执行用户,否则默认执行用户为root
比如使用thinkphp框架,不指定用户执行了一个定时任务,【不指定就是root】 不注意的话可能导致项目权限为www的用户无法写入日志,出现一些诡异的BUG
错误姿势
php /www/wwwroot/xiadmin/think doTest
正确姿势
在执行命令前切换用户 su www -s
su www -s /www/server/php/74/bin/php /www/wwwroot/xiadmin/think doTest