使用HYDRATION_RECORD,Doctrine 1.2水合作用失败,但与HYDRATION_ARRAY一起使用

J0H*_*0HN 7 php mysql doctrine doctrine-1.2 php-5.2

我有一个完美运行的代码Doctrine_Core::HYDRATION_ARRAY,但崩溃了Doctrine_Core::HYDRATION_RECORD.该页面加载大约两分钟,并显示标准的浏览器错误消息,这是类似的

Connection to the server was lost during the page load.
Run Code Online (Sandbox Code Playgroud)

(我有本地化的浏览器,所以这不是确切的错误消息,但已翻译).

使用mysql命令行Show processlist输出

+-----+--------+-----------------+--------+---------+------+-------+------------------+
| 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             |
+-----+--------+-----------------+--------+---------+------+-------+------------------+
Run Code Online (Sandbox Code Playgroud)

代码本身:

 $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);
Run Code Online (Sandbox Code Playgroud)

所以我认为查询没有填充正确的SQL.$q->getSqlQuery()如果通过命令行或phpMyAdmin执行,Hovewer 输出正确运行的SQL.

服务器配置:

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
Run Code Online (Sandbox Code Playgroud)

一切都在localhost上运行,所以这不是连接问题.

该特定查询的数据量非常小 - 大约十几条记录,因此它与内存或时间限制无关.safe_modeoff,display_errorson,error_reporting6135.

有人可能会指出我遗漏的一些提示或警告吗?

更新: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)
Run Code Online (Sandbox Code Playgroud)

输出:

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... 
Run Code Online (Sandbox Code Playgroud)

因此,查询本身是正常的,数据按预期方式进行了处理.你需要模型定义吗?

更新5运行查询时HYDRATE_RECORD httpd.exe消耗其中一个CPU核心的100%.

最终更新不知道为什么,但现在它的工作原理......没有改变任何东西.当我在这个问题上放置赏金时,看起来只是在等待.:)但是,仍然,因为我已经放置了赏金,任何想法之间的区别HYDRATE_ARRAYHYDRATE_RECORD可能崩溃脚本的任何想法都表示赞赏.

The*_*ter 0

我在 Doctrine 1.2 中也遇到过类似的问题,并发现 PHP 由于超出内存限制或执行时间而报告了 FATAL 错误,有时这种情况甚至导致 PHP 导致分段错误。

您可以在 Apache 错误日志文件中找到这些错误。在我的 OS X 机器上,这些文件位于/var/log/apache2/error_log. 您可以在 PHP 配置中增加允许的内存或最大执行时间。

就我而言,这是由于从数据库中获取的记录量过多导致内存消耗过多造成的。有时,滋润 Doctrine_Records 似乎是一件相对困难的事情。

只是出于好奇,您期望结果中有多少行?