注:此问题已解决!如果您遇到类似问题,请参阅下面的解决方案!
背景:
这是一个基于 PHP/MySQL 的数据库驱动应用程序,大量使用 AJAX,几乎所有对服务器的请求都以这种方式进行。本例中的请求是 GET 请求,服务器通过 JSON 进行响应。用户通过数据集向内工作,返回的结果越来越精细。该应用程序稳定,并且已投入生产。
我可以在 3 个平台上调试它:我的开发笔记本电脑(OSX)、内部 Ubuntu 服务器和生产 Ubuntu 服务器。
每个 Ubuntu 服务器都运行一个 MySQL 服务器和一份 Apache 副本。
我的开发笔记本电脑连接到MySQL 服务器运行在我们的内部Ubuntu 服务器,并运行它的自己的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 副本时,会失败。
我完全困惑了。如果能得到任何帮助,我将不胜感激。
答案1
解决方案
事实证明,尽管 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'))) { ...