我遇到了一个荒唐的问题。
我正在为我的一个项目使用 Laravel。我曾经在 Laravelv5.2.39(大多数 Symfony 包都在v3.0.8如果相关的话),一切都运行良好。在更新(使用composer update
)到 Laravel之后v5.2.45,我遇到了一个非常奇怪的问题,那就是 PHP 混淆了页面并提供错误的页面。
重新启动 PHP-FPM 可以解决问题,直到我点击 Laravel 网站上的某个页面,之后 PHP 开始发疯并随机提供空白页、来自同一网站的错误页面或来自其他网站的页面。
这不仅发生在我的 Laravel 项目中,似乎也发生在同一个 Apache VirtualHost 上的所有网站上。例如,当我访问同一个 VirtualHost 上的另一个(不相关的)PHP 页面时,我有时会从有问题的 Laravel 网站获取服务页面,但也获取其他(不相关的)PHP 页面。但我只获取了之前已获取的服务页面,没有新的(未访问的)页面。
所以我猜这是一个与缓存有关的奇怪问题?我尝试将该 Laravel 网站从 PHP 的 OPCache 中列入黑名单,但这并不能解决问题。
我确信这与较新的 Laravel 版本(或 Laravel 依赖项之一的新版本)有某种关系,因为如果我重新安装旧版本,问题就消失了,但在composer update
.
服务器信息:
操作系统:Debian Stretch
Web 服务器:Apache/2.4.23
PHP-FPM:7.0.10-1
有趣的是,我认识的一个朋友不久前也遇到过同样的问题。我想他最后用的是 mod-php 而不是 PHP-FPM。
编辑:
因此,在我的项目上发布 后仍然面临此问题composer update
,我决定通过逐个更新每个包来进一步调查此问题。这样,我设法将问题缩小到symfony/http-foundation
从版本v3.0.8
到 的更新v3.0.9
。
因此,导致问题的原因不是 Laravel 的更新,而是其某个依赖项的更新。
但我不知道接下来该如何进行。
答案1
原来我做过知道如何进行。
阅读 Symfony 3.0.9 的更新日志时,关于提交的内容fastcgi_finish_request()
引起了我的注意。我读到PHP 文档此函数与 PHP-FPM 一起使用时可能会有一些缺陷。很有趣。这有关系吗?
为了调查我的 PHP-FPM 进程是否确实达到了pm.max_children
,我启用了 PHP-FPM 状态页面。即使没有 Laravel 网站,我也注意到一些线程似乎卡在了完成的状态。这是不对的……
事实证明,这是由我用于将 Apache 连接到 PHP-FPM 的 Apache 配置引起的:
<Proxy "unix:/run/php/php7.0-fpm.sock|fcgi://php-fpm">
# we must declare a parameter in here or it'll not register the proxy ahead of time
ProxySet disablereuse=on
</Proxy>
<FilesMatch \.php$>
SetHandler proxy:fcgi://php-fpm
</FilesMatch>
这或多或少是早期让它与 UDS 路径一起工作所需的一种 hack。现在看来这不再是必需的,并导致 PHP-FPM 进程挂起。完成的状态,因为当我删除它并启用方便提供的配置时,这个问题就解决了conf-available/php7.0-fpm.conf
。
将 Symfony 包更新至 3.0.9 后,问题不再出现。
这可能是我见过并解决过的最奇怪的服务器相关问题,我仍然不完全明白发生了什么。但问题已经解决了。