7

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

Connection to the server was lost during the page load.

(我已经本地化了浏览器,所以这不是确切的错误消息,而是翻译的)。

使用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             |
+-----+--------+-----------------+--------+---------+------+-------+------------------+

代码本身:

 $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()但是,如果通过命令行或 phpMyAdmin 执行,输出正确的 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

一切都在本地主机上运行,​​所以这不是连接问题。

该特定查询的数据量非常小 - 大约十几个记录,因此与内存或时间限制无关。safe_modeoffdisplay_errorsonerror_reporting6135

有人可以指出我缺少的一些提示或警告吗?

更新:最奇怪的是它HYDRATION_RECORD不时使用。

UPDATE2:当我试图从查询中获取一些东西时它崩溃了,例如getFirst()。没有获取它可以工作,但我真的不需要我无法获取数据的查询表单。

UPDATE3:我已经解决了这个问题,但我仍然感兴趣,发生了什么。

更新 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% 的 CPU 内核之一。

最终更新不知道为什么,但现在它工作了......没有改变任何东西。当我在这个问题上悬赏时,它似乎只是在等待。:) 但是,由于我已经提供了赏金,任何关于两者之间的区别HYDRATE_ARRAYHYDRATE_RECORD可能导致脚本崩溃的想法都值得赞赏。

4

2 回答 2

1

print_r在以某种方式( 、var_dump等)转储整个记录集或仅单个记录时,我看到了类似的行为。这是因为 Doctrine 使用了包含大量循环引用的高结构化类层次结构。当您使用Doctrine_Core::HYDRATION_ARRAY.

因此,任何提到的功能(但我认为这可以是其他一些重现该功能的方法)将开始一个无限循环,导致 100% 的 cpu 使用率,直到它达到一个终止点。

不知道这对您的情况是否有帮助。

于 2011-08-26T12:38:13.343 回答
0

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

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

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

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

于 2011-08-18T09:49:00.880 回答