【问题标题】:Memcacheq vs cronjob in memory consumptionMemcacheq 与 cronjob 的内存消耗
【发布时间】:2012-02-27 10:42:12
【问题描述】:

与 crontab 执行后台任务的方式相比,在 php 上编写守护程序(侦听/处理队列)是否会占用大量内存?

我在一个引擎下的一台服务器上有大约 600 家商店。店主运行的某些任务需要大量时间,因此分叉它们是合理的。将任务放入 cron 效果很好,我只是不喜欢长达 59 秒的启动延迟(cron 的限制)。所以我想试试队列系统。我只是担心它会迫使我运行 600 个 php 线程来监听/处理这些队列(商店来自不同的客户,我无法制作一个通用的守护进程)。它不会自动需要更多 600-1000MB 的内存,与 cron 相比,这不是一个好的选择(它只会在计划的情况下加载一个进程)。

【问题讨论】:

    标签: php cron message-queue daemon


    【解决方案1】:

    与其将它们放入一个延迟 59 秒的 cron 中,不如使用“at”守护进程运行它们?您可以简单地使用“at now”,它们会立即运行。例如,参见:

    http://unixhelp.ed.ac.uk/CGI/man-cgi?at

    我当然不会考虑在 PHP 中同时运行 600 个线程作为守护进程。

    【讨论】:

    • 感谢您让我清醒:) 好的,“at”对我来说是新事物,而我曾经使用过“nohup”。在这种情况下,“nohup”有什么不同吗?因为 exec("nohup php mytask.php") 看起来比 exec("echo 'php mytask.php' | at now") 更直接;
    • nohup 表示运行该进程的用户注销时不会被杀死;仅靠它本身不足以解决您的问题,但是如果您添加一个与号(以使 nohup 任务在后台运行),它可能会起作用。这样你就可以exec("nohup php mytask.php &") 参见:en.wikipedia.org/wiki/Nohup
    • 谢谢 Daan,我确实忘了加 &,现在这些命令等效吗?
    • 我不是 Linux 专家,但我认为由“at”守护进程运行的进程在不同的用户下运行,而“nohup”使它们与您的用户关联。对于“nohup”,如果您的脚本将任何输出发送到 STDOUT/STDERR,它可能会挂起,而“at”守护进程可能会将输出发送到 /dev/null。不过,对这些问题更了解的人可能想要纠正这一点。
    【解决方案2】:

    我之前构建了运行多达 75-100 个单独的 PHP 进程的队列运行器,使用 supervisor 来启动我想要的任意数量。由于它们共享如此多的通用代码,这些代码也由操作系统共享,而不是重复。

    运行几十个或更多,可能使用某种类型的高优先级队列来处理小型、快速的作业以及可以愉快地运行大型、缓慢的作业的一部分工作人员。

    我已经在my tech blog, phpscaling.com 写了关于这个主题的文章。

    【讨论】:

      猜你喜欢
      • 2022-06-14
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2011-12-13
      • 2011-10-03
      • 2012-11-24
      • 2013-10-08
      相关资源
      最近更新 更多