ПРИМЕЧАНИЕ: этот вопрос был решен.! См. Ниже решение в моем случае, если у вас возникла аналогичная проблема!
Это приложение на основе PHP / MySQL, управляемое базой данных, которое интенсивно использует AJAX, и почти все запросы к серверу происходят таким образом. В этом случае запросы являются запросами GET, а сервер отвечает через JSON. Пользователь работает внутри набора данных, возвращая все более точные результаты. Приложение стабильное, находится в продакшене.
У меня есть возможность отлаживать это на трех платформах: на моем ноутбуке для разработки (OSX), на собственном сервере Ubuntu и на рабочем сервере Ubuntu.
На каждом сервере Ubuntu работает сервер MySQL и копия Apache.
Мой ноутбук для разработки подключается к сервер MySQL, работающий на нашем в доме Сервер Ubuntu и запускает его своя Сервер Apache.
Оба сервера Ubuntu имеют версию 9.10, x64, полностью обновленную из официальных источников, Apache 2.2.12, PHP 5.2.10.
Приложение возвращает результаты правильно во всех случаях, кроме одной части набора данных. Запросы данных в этом подразделе всегда возвращают 500 вместо набора результатов. Рассматриваемый подраздел - это просто запрос для возврата результатов на основе известных идентификаторов. Известно, что записи существуют и не содержат поврежденных данных.
У меня включен журнал отладки для Apache и установлен E_ALL для PHP (запись в файл). Когда происходит 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.
Я опубликовал исходный код, который вызывает ошибку 500 в PHP 5.2, а затем исправленный код, который работает должным образом на 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'))) { ...