在PHP中执行大型操作而不会耗尽内存?

时间:2012-04-16 21:40:33

标签: php

我用dompdf生成大约700个PDF并将它们保存到磁盘上。每个都涉及数据库查询以获取PDF的信息。当我运行它时,我大约需要2分钟,然后内存不足。

  1. 为什么我内存不足?不应该每个PDF生成消耗x内存,然后在完成时释放它吗?

  2. 在PHP中执行此类大型操作以避免勒死服务器有什么好的做法?

  3. 更多信息:

    • 在耗尽内存(大约100秒)之前生成许多PDF
    • 它失败的PDF在任何方面都不是异常大或特殊。它们都在4KB到500KB之间
    • 观察内存使用情况,因为它处理它只是慢慢爬上适合并开始直到它耗尽。

    我无法正确使用wysiwyg代码格式,所以这里有一个问题片段的贴纸:http://pastie.org/3800751

4 个答案:

答案 0 :(得分:1)

您的问题可能是您异步运行代码。尝试同步运行它,可能需要很长时间,但它会工作。另外,请确保在每个循环结束时丢弃对象。

答案 1 :(得分:1)

思路:

  • 增加内存限制ini_set
  • 使用cron作业,或者通常尝试运行每个pdf生成 与队列异步。
  • 批量(拆分)处理成数字 可以在每个批次之后在一页加载/重定向内处理 同一页面使用header /使用session跟踪每个脚本加载的位置/谨防浏览器的重定向限制

答案 2 :(得分:0)

通常,像这样的大型操作应分叉到子进程中,每个进程处理生成一个PDF。如果您的PDF或DB库泄漏内存,这应该避免内存不足的情况。

答案 3 :(得分:0)

尝试在memory_limit

处更改php.ini