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

  • 本文关键字:内存 操作 PHP 执行 大型 php
  • 更新时间 :
  • 英文 :


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

  1. 为什么我的内存不足?难道每一代PDF都不应该消耗x内存,然后在完成后释放它吗?

  2. 在 PHP 中,执行这样的大型操作以避免扼杀服务器的好做法是什么?

更多信息:

  • 它在内存不足(大约 100 秒)之前生成许多 PDF
  • 它失败的 PDF 在任何方面都不是异常大或特殊的。它们都在 4KB 到 ~500KB 之间
  • 在处理内存时观察内存使用情况,它只是慢慢地断断续续地爬升并开始,直到用完为止。

我无法让所见即所得的代码格式正确,所以这里有一个有问题的片段的糊状物:http://pastie.org/3800751

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

想法:

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

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

尝试在php.ini更改memory_limit

最新更新