问题源自会议上的一个sentry报错案例(类似上图,代码略有不同,主要是file_get_contents请求一个图片URL404导致的问题)。
PS:除非特殊说明,后续默认PHP7.2版本,Laravel5.6版本。
调试后,觉得还不错,值得记录一下。
之前生产曾经有一个需求是用file_get_contents根据URL获取图片,然而由于图片可能不存在,当时是PHP5.6版本,导致了语句长时间堵塞。改用CURL,结合CURLOPT_TIMEOUT超时配置项和curl_getinfo($ch,CURLINFO_HTTP_CODE)是否等于200来先判断图片有消息。
因为这事儿对file_get_contents依稀还有点印象,记得会抛出一个错误,而不是异常,无法被catch(\Exception $e)捕捉。而TP5.0框架,会捕捉error转成exception并throw,Laravel内部处理估摸着也差不多,能够解释页面上的ErrorException。
这是初始的一个假设,后续进行一波验证。
新建一个空白项目下的index.php
运行代码:
部分输出:
PHP Warning: file_get_contents(http://localhost/1.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
运行代码:
部分输出:
PHP Warning: file_get_contents(http://localhost/1.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
确实存在一个Warning级别的error,try、catch失效;再在公司的一个Laravel项目里运行代码,运行环境基于docker镜像与生产环境相同。
输出:
exception:file_get_contents(http://localhost/1.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
结果catch成功执行输出结果。
本地PHP XAMPP环境运行新建的Laravel(运行原项目,会有配置问题所以单独开了一个)
报错如下:
出错非常符合逻辑。
此时,PHP版本一致,一个基于docker,另一个基于XAMPP;Lara