Назад | Перейти на главную страницу

Apache 2 на Ubuntu возвращает 500 по неизвестной причине?

ПРИМЕЧАНИЕ: этот вопрос был решен.! См. Ниже решение в моем случае, если у вас возникла аналогичная проблема!

Задний план:

Это приложение на основе 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'))) { ...