【问题标题】:Allowed memory size exhausted in DoctrineDoctrine 中允许的内存大小已用尽
【发布时间】:2012-04-30 00:05:38
【问题描述】:

我使用 symfony 1.4(来自一个任务)和 Doctrine 1.2 从很多文件中导入数据。

它运行良好,但几分钟后我从 PHP 中收到“允许的内存大小已用尽”致命错误,不是在我的代码中,而是在 Doctrine 中……

Call Stack:
    0.0004     325216   1. {main}() C:\wamp\www\XPower\symfony:0
    0.0125     587704   2. include('C:\wamp\www\XPower\lib\vendor\symfony\lib\command\cli.php') C:\wamp\www\XPower\symfony:14
    1.9202    6981872   3. sfSymfonyCommandApplication->run() C:\wamp\www\XPower\lib\vendor\symfony\lib\command\cli.php:20
    1.9233    6983528   4. sfTask->runFromCLI() C:\wamp\www\XPower\lib\vendor\symfony\lib\command\sfSymfonyCommandApplication.class.php:76
    1.9234    6983688   5. sfBaseTask->doRun() C:\wamp\www\XPower\lib\vendor\symfony\lib\task\sfTask.class.php:97
    3.0794    7047088   6. dataImportTask->execute() C:\wamp\www\XPower\lib\vendor\symfony\lib\task\sfBaseTask.class.php:68
    3.2731    8663752   7. dataImportTask->traiterDossier() C:\wamp\www\XPower\lib\task\dataImportTask.class.php:36
    7.7762   17906824   8. dataImportTask->traiterDossier() C:\wamp\www\XPower\lib\task\dataImportTask.class.php:55
  264.4390  133557080   9. xPower::importerXml() C:\wamp\www\XPower\lib\task\dataImportTask.class.php:64
  264.5919  133609328  10. xPower::importerFichierXml() C:\wamp\www\XPower\lib\XPower.class.php:312
  265.4313  134048568  11. InverterTable->findOneBySerialNumber() C:\wamp\www\XPower\lib\XPower.class.php:445
  265.4313  134048776  12. Doctrine_Table->__call() C:\wamp\www\XPower\lib\XPower.class.php:445

我尝试在 Doctrine 调用中添加一些“->free()”,但现在它似乎在 InverterTable->findOneBySerialNumber() 上失败了,这是一种“神奇”的 Doctrine 方法。

如何解决我的问题?我是否需要编写自己的“findOneBySerialNumber”方法,添加对“free()”的调用?

【问题讨论】:

    标签: php symfony-1.4 doctrine-1.2


    【解决方案1】:

    这是一个普遍存在的教义问题。你必须使用pcntl_fork

    我总是以this gist为例。

    pcntl_fork 不适用于 Windows,因为它需要遵循 POSIX 标准的操作系统。

    仅仅帮助教义释放对象可能也足够了,here's a great answer about that

    如果你有一些The MySQL server has gone away:

    在使用Doctrine和MySQL时,可能需要添加以下子线程代码:

    Doctrine_Manager::connection()->close();
    

    这将关闭数据库连接,Doctrine 将在第一次查询时自动重新创建它。

    【讨论】:

    • 那太糟糕了。现在想想,我现在有很多文件,因为这是第一次导入,如果我定期运行我的任务,我应该不会有任何问题。
    • 我已经用另一个关于释放教义对象的答案更新了我的答案,也许这样会容易得多。
    • 好吧,我试试 profiler: false 和 OH MY GOD,现在一切都这么快了! O.O大声笑很好的提示,谢谢:)
    • 很好的答案,但我得到“mysql 服务器已经消失”。公认的解决方案是使用 mysql_close 后跟 mysql_connect... 现在需要弄清楚如何使用 symfony 进行 taht。
    • ...明白了。相应地编辑了答案。
    猜你喜欢
    • 2013-02-08
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多