关于LUMEN无输出500错误
最近接入支付宝支付时遇到一个问题,在做支付回调函数的时候我先是写了一个 Log::info("alipay_notify_info",$request->all())
用来记录回调时的支付宝请求参数,但发现无论如何日志都没有任何记录,而且回调函数里面的东西也没用执行,于是我自己请求该回调地址,发现服务器上 HTTP 状态码为 500 但是没有任何报错信息和输出,日志也没有记录,于是乎在本地再测试了一下,本地输出正常,无报错信息,日志也记录了 HTTP 请求信息,继续调试 N 次后无果。
我猜想是不是日志出了问题,于是注释掉日志记录,正常输出,这就奇怪了,Lumen 自带的日志记录怎么可能有问题?也不是第一次用了,我也从来没有改过框架内的代码,并且日志直到现在还记录了今天的队列异常信息,怎么可能有问题呢?而且本地也没问题,就服务器有问题,代码两端都是保持完全一致的,那原因在哪?我回想这个类文件里还引用了其他包,会不会是其他包里重名的 Log
类,于是又把 Log
重命名,照样不行,无输出无日志记录,当时已经下班了,比较饿,看了一下想了想把自己一两个月没关的电脑关了,心想明早再来开机重新试试。
第二天,上班,开机,启动服务,打开端口,开IDE开调试工具开各种乱七八糟的东西后再调试写的支付宝回调接口,卧槽,好了?正常输出,正常记录日志,正常写入支付信息更新账单等业务操作,一切没问题,我心想还真是万能的重启试试,于是再让同事测试了一下支付宝支付,OK,没问题,这问题也就撂下不管了。
过了大概七天左右,七天内也断断续续测了几次支付宝支付,没有出现过问题,然而在一天早上,前端同事说他支付了账单但状态没变,于是我开始看,数据库里状态未支付,看日志,没有请求信息,我想难道支付宝出了问题?没给我发回调?我又查看了我的 GIT 提交记录和本地历史,自从写好之后支付宝这块从来没动过,然后又 DEBUG ,无果,心想上次重启了好了,这次再试试,一边重启一边想着如果真重启就好那这就诡异了,我就只重启了本地电脑,服务器动都没动,如果这都能好这问题就更难排查了。
开机满怀期待测试接口, GG, 还是不行,那这问题就有意思了,看来和我的电脑肯定无关。问题出在服务器上,而且
php 错误日志由于一些原因服务器上也没用开启,无法查看日志。会不会是硬盘满了写不进去?查看硬盘占用 used 17%,离满还早得很。没有写入权限?也不可能,日志都写入那么久了,天天都有写入,直到几分钟前还记录了消息队列里的警告信息。那这种偶发性的问题关键就是要找到触发 BUG 的条件,于是我开始找日志里写入的信息,这次 BUG 和上次 BUG 出现时日志都写入了队列里输出的信息,而且第二天就好了,我的日志记录都是 daliy
每天记录一次,那会不会是这种可能?为了验证猜想,我直接把 logs 目录执行了一次 chmod -R 777
, Ok, 没问题。
那么原因就很简单了:没有日志写入权限。
那为什么队列任务的信息能写入到日志呢?为什么平时都能写入到日志呢?因为我的队列任务是以 root 权限执行的任务,而队列任务作为当天第一次写入日志时在创建的时候就会创建一个 655 权限的日志文件,而普通的执行文件都是由 nginx 用户来执行,自然没有权限对日志文件进行写操作,随即引发问题,导致错误。
这次问题虽然最后发现了原因了之后很好解决,但开始出现时确实让人摸不着头脑,又没有任何错误信息无法准确 DEBUG 感觉身体被掏空,今天写出来给自己加深印象,也希望给看到的朋友提供下思路,遇到类似问题不用再浪费时间。