У меня есть код, который отлично работает с Doctrine_Core::HYDRATION_ARRAY
, но вылетает с Doctrine_Core::HYDRATION_RECORD
. Страница загружается около двух минут и показывает стандартное сообщение об ошибке браузера, что-то вроде
Connection to the server was lost during the page load.
(У меня локализован браузер, поэтому сообщение об ошибке не точное, но переведено).
Использование командной строки mysql Show processlist
output
+-----+--------+-----------------+--------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+--------+-----------------+--------+---------+------+-------+------------------+
| 698 | root | localhost:53899 | NULL | Query | 0 | NULL | show processlist |
| 753 | *user* | localhost:54202 | *db1* | Sleep | 102 | | NULL |
| 754 | *user* | localhost:54204 | *db2* | Sleep | 102 | | NULL |
+-----+--------+-----------------+--------+---------+------+-------+------------------+
Сам код:
$q = Doctrine_Query::create()
->select("fc.*")
->from("Card fc")
->leftJoin("fc.Fact f")
->where("f.deckid=?", $deck_id);
$card = $q->execute(array(), Doctrine_Core::HYDRATE_RECORD);
//Commenting the above line and uncommenting below line leads to an error
//$card= $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
Так что я думаю, что запрос не заполнен правильным SQL. Однако, $q->getSqlQuery()
выводит правильный SQL, который отлично работает, если выполняется через командную строку или phpMyAdmin.
Конфигурация сервера:
Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k mod_wsgi/3.3 Python/2.7.1 PHP/5.2.12
Mysql 5.1.40-community
Все работает на локальном хосте, так что это не проблема подключения.
Количество данных для этого конкретного запроса очень мало - около десятка записей, так что это не имеет никакого отношения к памяти или ограничениям по времени. safe_mode
равно off
, display_errors
равно on
, error_reporting
равно 6135
.
Может ли кто-нибудь указать на некоторые подсказки или предостережения, которые я пропускаю?
ОБНОВЛЕНИЕ: самое странное, что время от времени он работает с HYDRATION_RECORD
.
UPDATE2: происходит сбой при попытке извлечь что-либо из запроса, например, getFirst()
. Без извлечения это работает, но мне действительно не нужна форма запроса, из которой я не могу получить данные.
ОБНОВЛЕНИЕ 3: Я обошел эту проблему, но мне все еще интересно, что происходит.
Обновление 4:
Запрос SQL:
SELECT f.id AS f__id, f.createdat AS f__createdat, f.updatedat AS f__updatedat,
f.flashcardmodelid AS f__flashcardmodelid, f.source AS f__source,
f.content AS f__content, f.md5 AS f__md5
FROM flashcard f
LEFT JOIN fact f2 ON f.id = f2.flashcardid AND (f2.deleted_at IS NULL)
WHERE (f2.deckid = 19413)
Выход:
f__id f__createdat f__updatedat f__flashcardmodelid f__source f__content
245639 2011-08-05 20:00:00 2011-08-05 20:00:00 179 jpod lesson 261 {"source":"\u7f8e\u5473\u3057\u3044","target":"del...
Итак, сам запрос в порядке, данные отображаются в соответствии с ожиданиями. Вам нужно определение модели?
Обновление 5 При выполнении запроса с HYDRATE_RECORD
httpd.exe
потребляется 100% одного из ядер ЦП.
Окончательное обновление Не знаю почему, но теперь это работает ... Ничего не изменилось. Похоже, он просто ждал, когда я вознагражуюсь за этот вопрос. :) Но, тем не менее, поскольку я уже разместил награду, любая идея о том, в чем разница между HYDRATE_ARRAY
и HYDRATE_RECORD
, которая может привести к сбою сценария, приветствуется.