Ubuntu 上的 Apache 2 無故返回 500?
注意:這個問題已經解決了!如果您遇到類似問題,請參閱下面的解決方案以了解我的情況!
背景:
這是一個基於 PHP/MySQL 的數據庫驅動應用程序,大量使用 AJAX,幾乎所有對伺服器的請求都以這種方式發生。在這種情況下,請求是 GET 請求,伺服器通過 JSON 響應。使用者通過數據集向內工作,返回越來越精細的結果。該應用程序穩定,並且正在生產中。
我有能力在 3 個平台上進行調試:我的開發筆記型電腦 (OSX)、內部 Ubuntu 伺服器和生產 Ubuntu 伺服器。
每個 Ubuntu 伺服器都執行一個 MySQL 伺服器和一個 Apache 副本。
我的開發筆記型電腦連接到在我們內部Ubuntu 伺服器上執行的 MySQL 伺服器,並執行它自己的Apache 伺服器。
兩台 Ubuntu 伺服器都是 9.10、x64,通過官方資源 Apache 2.2.12、PHP 5.2.10 完全更新。
現在有趣的部分:
應用程序在所有情況下都正確返回結果,除了數據集的一個子部分。本小節中的數據請求始終返回 500 而不是結果集。有問題的小節只是一個基於已知 ID 返回結果的查詢。這些記錄已知存在,並且不包含損壞的數據。
我為 Apache 打開了調試日誌記錄,並為 PHP 設置了 E_ALL(記錄到文件)。當 500 發生時,我在 Apache 的 error.log 中看到以下內容(x 表示屏蔽):
[Sun Aug 01 15:43:54 2010] [debug] mod_deflate.c(615): [client 192.168.1.28] Zlib: Compressed 0 to 2 : URL /apps/xxxx/connectors/details_lookup.php, referer: http://xxxx.xxxx.local/apps/xxxx/
這意味著缺乏數據。但是,沒有任何錯誤記錄到 PHP 的錯誤日誌中。同時,我可以毫無問題地返回數據集中其他地方的結果。
所以你可能會想“問題一定出在數據庫上”。
但是,當我使用我的開發筆記型電腦(以及它自己的 Apache 副本)連接到我們內部網路上的同一台 MySQL 伺服器時,我可以執行生成 500 的請求而完全沒有錯誤。
因此,當我在筆記型電腦上的 Apache 伺服器上執行應用程序時,一切都很酷。當我在同一數據庫伺服器上對同一數據庫中的相同數據執行相同請求但使用該伺服器的 Apache 本地副本時,失敗。
我完全感到困惑。在這一點上,任何幫助將不勝感激。
解決方案
事實證明,儘管 PHP 5.2 引入了 DateTime 對象,但 DateTime->diff() 方法直到 PHP 5. 3才可用。
就我而言,條件程式碼塊將根據某些結果的內容執行。導致 500 的結果是使用 DateTime->diff 呼叫部分程式碼。
我已經發布了在 PHP 5.2 中導致 500 錯誤的原始程式碼,然後是在 PHP 5.2 上按預期執行的更正程式碼。
誰能解釋為什麼 PHP 不會為此記錄錯誤,即使我使用的是 E_ALL?
PHP 5.2不兼容的程式碼:
$effective = new DateTime($eff, new DateTimeZone('America/New_York')); $diff = $effective->diff(new DateTime(date('Y-m-d'), new DateTimeZone('America/New_York'))); if ($diff->format('%R') === '-') { ...
PHP 5.2兼容程式碼:
$effective = new DateTime($eff, new DateTimeZone('America/New_York')); if ($effective > new DateTime(null, new DateTimeZone('America/New_York'))) { ...