注意:这个问题已经解决 ! 如果您遇到类似问题,请参阅下面的解决scheme。
这是一个基于PHP / MySQL的数据库驱动的应用程序,大量使用AJAX,几乎所有的服务器请求都以这种方式发生。 在这种情况下请求是GET请求,服务器通过JSON响应。 用户通过返回更精细结果的数据集向内工作。 该应用程序是稳定的,并在生产。
我有能力在3个平台上进行debugging:我的开发笔记本电脑(OSX),内部Ubuntu服务器和生产Ubuntu服务器。
每个Ubuntu服务器都运行一个MySQL服务器和一个Apache的副本。
我的开发笔记本电脑连接到运行在我们内部 Ubuntu服务器上的MySQL服务器,并运行它自己的 Apache服务器。
这两个Ubuntu服务器是9.10,X64,通过官方来源,Apache 2.2.12,PHP 5.2.10完全最新。
除了数据集的一个小节外,应用程序都会正确返回结果。 本小节中的数据请求总是返回500而不是结果集。 所讨论的小节仅仅是一个基于已知ID返回结果的查询。 logging已知存在,并且不包含损坏的数据。
我已经为Apache打开了debugging日志logging,并且为PHP设置了E_ALL(logging到文件)。 当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/
这意味着缺乏数据。 但是,没有任何错误logging到PHP的错误日志。 同时,我可以在数据集的其他地方返回结果,而不会出现问题。
所以你可能会想:“问题必须在数据库中”。
但是 ,当我使用我的开发笔记本电脑(和它自己的Apache副本)连接到我们的内部networking上的同一个MySQL服务器时, 我可以运行生成500的请求,而没有任何错误 。
所以当我在我的笔记本电脑上运行我的Apache服务器上的应用程序,一切都很酷。 当我对同一个数据库服务器上的相同数据库中的相同数据执行相同的请求,而是使用该服务器的Apache本地副本时,失败。
我完全困惑。 任何帮助将不胜感激在这一点上。
事实certificate,尽pipePHP 5.2引入了DateTime对象,但DateTime-> diff()方法在PHP 5之前并不可用。3 。
在我的情况下,一个条件代码块将执行取决于一些结果的内容。 导致500的结果是使用DateTime-> diff调用代码的一部分。
我已经发布了导致在PHP 5.2中出现500错误的原始代码,然后是按照预期在PHP 5.2上运行的更正后的代码。
任何人都可以解释为什么PHP不会logging这个错误,即使我使用E_ALL?
PHP 5.2 不兼容的代码:
$effective = new DateTime($eff, new DateTimeZone('America/New_York')); $diff = $effective->diff(new DateTime(date('Ym-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'))) { ...