PHP 使用 Laravel 提供錯誤的頁面
我有一個荒謬的問題。
我將 Laravel 用於我的一個項目。我在 Laravel v5.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 的更新,而是其依賴項之一的更新。
我不知道如何進一步進行。
事實證明,我確實知道如何進行。
閱讀 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 後,問題沒有再出現。
這可能是我見過並解決的最奇怪的伺服器相關問題,但我仍然不完全理解發生了什麼。但它已經解決了。