【问题标题】:PHP Memory Usage during sleep and loops睡眠和循环期间的 PHP 内存使用情况
【发布时间】:2011-07-19 08:12:08
【问题描述】:

我有几个关于 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 作业的任务(这甚至不是共享主机上的一个选项),并且不需要用户在单个页面上保持浏览器打开。

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

【问题讨论】:

  • memory_get_usage() 会告诉你。
  • @alex 我做了一个基本测试,我记录了开始内存使用情况,循环了 100,000 次,将 MD5() 的值(基于循环迭代)分配给一个变量,并且看到最小的内存增加.我认为这意味着循环 1000 次以发送电子邮件的脚本不应比发送电子邮件 50 次的脚本增加太多。同样根据我的测试,脚本在睡眠周期中占用了相同数量的内存,虽然很难说。
  • 这是您计划分发的东西吗?
  • @Dagon 是的,很有可能。你问什么原因?
  • 我看到了一些问题。大多数主机会杀死需要很长时间的脚本,大多数主机会限制每天\每小时发送的邮件。这就是为什么如果您想发送任何重要数量的消息,大多数人都会注册其中一家 SAAS 时事通讯提供商(例如我工作的公司)。我认为 cron 方法比大多数共享主机的守护程序方式可靠得多

标签: php apache email cron newsletter


【解决方案1】:

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

注意事项:

  • IIRC,PHP 有一个基于计数器的垃圾 集电极。这意味着,与 Java,两个对象分别引用 即使没有,其他也会留在内存中 由您的程序访问。你需要 当你要小心这个 “放弃”你的对象。
  • Web 服务器 经常有杀戮的机制 长时间运行的脚本。这可能会打败 你在这里的目的——特别是如果 服务器的配置不能 调整。

【讨论】:

  • 感谢您的回复。为了解决您的第二个警告,如果我的脚本通过说 file_get_contents 调用自身并在 5 秒后超时怎么办。它会循环 50 次,再次加载自身然后退出。当它再次加载时,它将运行接下来的 50 次并重复。想法?
  • Hackish,但它可以工作。如果它确实有效,我宁愿监控在达到通常的最大执行时间之前查看和重新加载所花费的时间(无论如何——我对共享主机不够熟悉)。我的意思是:数到 30 秒而不是 50 封电子邮件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
相关资源
最近更新 更多