资讯专栏INFORMATION COLUMN

关于 Lumen 无输出 HTTP 状态码为 500 的诡异错误

dayday_up / 1037人阅读

摘要:关于无输出错误最近接入支付宝支付时遇到一个问题,在做支付回调函数的时候我先是写了一个用来记录回调时的支付宝请求参数,但发现无论如何日志都没有任何记录,而且回调函数里面的东西也没用执行,于是我自己请求该回调地址,发现服务器上状态码为但是没有

关于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 感觉身体被掏空,今天写出来给自己加深印象,也希望给看到的朋友提供下思路,遇到类似问题不用再浪费时间。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30628.html

相关文章

  • 学习 Lumen 用户认证 (一)

    摘要:在开发中,用户认证是核心,是数据是否有保障的前提,目前主要有两种常用方式进行用户认证和。附是为了在网络应用环境间传递声明而执行的一种基于的开放标准。 好久没写 PHP 代码了,尤其是 Lumen,我是 Lumen 的忠实用户,自从面世开始,我就将 Lumen 作为我 API 的主要框架使用。 但说到 API,不得不说的一个概念:「前后端分离」,现在越来越多的团队都采用前后端分离,彻底解...

    wangzy2019 评论0 收藏0
  • 好好说道下Http协议

    摘要:是一种无状态协议。响应空白行代表相应头结束响应正文或者叫消息主题响应行响应的第一行为响应行,其中有版本,状态码以及消息响应头第二行至末尾空白行为响应头,由服务器向客户端发送。这个头通常配合状态码使用。 无状态的Http协议 http协议的最新版本是1.1。是一种无状态协议。 什么是无状态协议? 无状态协议是指web浏览器与web服务器之间不需要建立持久链接。当客户端向服务器端发送请求(...

    array_huang 评论0 收藏0
  • HTML状态码收集(301,404,500等)

    摘要:状态码是用以表示网页服务器响应状态的位数字代码。状态码一共分为五类。这些状态码被分为五大类用于指定客户端应相应的某些动作。 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。HTTP状态码一共分为五类。状态码的第一个数字代表了响应的五种状态之一。 这些状态码被分为五大类: 100-199 用于指定客户端应相应的某些动作。 200-29...

    only_do 评论0 收藏0
  • nginx 常用配置记录

    摘要:如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个,该将成为头部值。没有状态码的将被视为一个状态码,这种情况下需要以或者开头。因为和不能简单的只返回状态码,还必须有重定向的,这就是指令无法返回的原因了。 HTTP模块(核心模块,也是主要用到的模块) server模块 server模块是http的子模块,它用来定义一个虚拟主机 例子: server { ...

    Youngs 评论0 收藏0
  • Lumen 初体验

    摘要:介绍为速度而生的框架。是官方给出的例子,直接拷贝命名为。一般来说,我们应该避免使用末尾带斜杠的。因为它如果找不到文件,就会自动在末尾加个斜杠,尝试寻找目录下的文件等等,具体是在中配置。方案修改修改的配置文件,将指向重启。 介绍 Lumen:为速度而生的 Laravel 框架。 Lumen 是 Laravel 的作者(Taylor Otwell)的又一力作。简单、快速、优雅的它的特点...

    Leck1e 评论0 收藏0

发表评论

0条评论

dayday_up

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<