2

我有几个关于 PHP 内存使用的问题。我将自己进行一些测试,但获得各种建议非常有帮助。

我最近了解了 PHP 函数 ignore_user_abort(),即使用户关闭页面,它也允许脚本继续运行。我正在考虑将它用于我的电子邮件通讯工具而不是 Cron 作业,因为配置 Cron 作业有很多麻烦。让用户停留在页面上、使用 AJAX 请求以及在页面内容交付后运行部分脚本的替代方法也都存在问题。

我的解决方案是在脚本的开头运行 call ignore_user_abort(true),在生成内容后的最后,调用 flush() 以进行良好的测量,然后运行时事通讯脚本。或者,使用 AJAX 执行此操作。

首先,有没有人看到这种方法的问题?

其次,如果我使用没有设置时间限制的脚本,并且在每封电子邮件中都使用一个while循环,那么如果我一次性完成它,内存使用情况会如何?因为我会覆盖变量,而不是使用新变量,所以我认为它会很低。

第三,因为如果我要发送大量电子邮件,比如每次运行 1000 封,我不想让我的邮件服务器超载。在我的 cron 作业中,我每 5 分钟运行一次脚本,发送一批 50 封电子邮件。如果我一次性执行此操作,我可以发送 50 封电子邮件,调用 sleep 说 5 分钟,然后再继续发送 50 封电子邮件吗?如果是这样,睡眠期间的脚本内存使用情况如何?这会是一种有效的方法吗?

我在这里真正想做的是想出一种方法来创建一个时事通讯工具,它不需要设置 Cron 作业的复杂(对于非技术人员)任务(这甚至不是一个选项共享主机),并且不需要用户在单个页面上保持浏览器打开。

欢迎任何想法建议或反馈。谢谢!

4

1 回答 1

1

在以前的工作中,我们为 PHP 中的一个关键函数编写了一个守护程序,与您描述的不完全一样,但足够相似——当然还有循环和睡眠。我们非常怀疑它的长期稳定性——特别是在内存管理方面——所以我们对其进行了相当严格的压力测试。结果非常好,代码投入生产并完美运行了几个月甚至几年。

注意事项:

  • IIRC,PHP 有一个基于计数器的垃圾收集器。这意味着,与 Java 不同,两个相互引用的对象将保留在内存中,即使您的程序无法访问。当你“放弃”你的对象时,你需要小心这一点。
  • Web 服务器通常具有终止长时间运行脚本的机制。这可能会破坏您的目的 - 特别是如果无法调整服务器的配置。
于 2011-03-20T23:35:52.810 回答