Php

PHP 使用 Laravel 提供錯誤的頁面

  • December 25, 2016

我有一個荒謬的問題。

我將 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.8v3.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 後,問題沒有再出現。

這可能是我見過並解決的最奇怪的伺服器相關問題,但我仍然不完全理解發生了什麼。但它已經解決了。

引用自:https://serverfault.com/questions/801940