如何使用 PHP 设置 Beanstalkd

2024-04-26

最近我一直在研究 Beanstalkd 与 PHP 的使用。我学到了很多东西,但对服务器上的设置等有一些疑问。

我认为它是这样工作的:

  1. 我在 Ubuntu 服务器上安装 Beanstalkd 和所有依赖项(例如 libevent)。然后我启动 Beanstalkd 守护进程(它基本上应该始终运行)。
  2. 在我网站的某个地方(例如当用户执行某些操作时等)任务被添加到 Beanstalkd 队列中的各个管中。
  3. 我有一个 bash 脚本(例如下面的脚本),它作为守护进程运行,基本上执行 PHP 脚本。

    #!/bin/sh
    php worker.php
    

4)工作脚本将具有类似这样的内容来执行排队的任务:

while(1) {
  $job = $this->pheanstalk->watch('test')->ignore('default')->reserve();
  $job_encoded = json_decode($job->getData(), false);
  $done_jobs[] = $job_encoded;
  $this->log('job:'.print_r($job_encoded, 1));
  $this->pheanstalk->delete($job);
}

现在,这是我基于上述设置的问题(如果我错了,请纠正我):

  1. 假设我的任务是将 RSS 提要导入数据库或其他内容。如果 10 个用户同时执行此操作,他们都会在“测试”管中排队。然而,他们一次只会被处决一个。让 10 个不同的管子同时执行会更好吗?

  2. 如果我确实需要更多管子,是否也意味着我需要 10 个工作脚本?每个管子都有一个,除了 watch() 函数中的字符串文字外,所有代码都同时运行,代码基本相同。

  3. 如果我将该脚本作为守护进程运行,它是如何工作的?它会不断执行worker.php脚本吗?理论上,该脚本会循环直到队列为空,所以它不应该只启动一次吗?守护进程如何决定执行worker.php的频率?这只是一个设置吗?

Thanks!


  1. 如果工人获取 feed 的时间不是太长,那就没问题了。如果需要一次处理多个工作程序,您可以运行多个工作程序。我有一个系统(目前使用 Amazon SQS,但我之前曾使用 BeanstalkD 做过类似的事情),最多有 200 个(或更多)工作人员从队列中拉出。
  2. 单个工作脚本(同一脚本运行多次)应该没问题 - 该脚本可以同时监视多个管,并且第一个可用的将被保留。您还可以使用job-stat命令来查看特定 $job 来自哪里(哪个管道),或者如果您需要区分每种类型和另一种类型,则将一些元信息放入消息中。
  3. 运行工人的一个很好的例子是此处描述 http://www.phpscaling.com/2009/06/23/doing-the-work-elsewhere-sidebar-running-the-worker/。我还添加了主管 http://supervisord.org/(也有用的帖子 http://phpadvent.org/2009/daemonize-your-php-by-sean-coates开始)轻松启动并保持每台机器运行多个工作进程(我运行 shell 脚本,如第一个链接 http://www.phpscaling.com/2009/06/23/doing-the-work-elsewhere-sidebar-running-the-worker/)。我会限制它循环的次数,并将一个数字放入reserve()让它等待几秒钟或更长时间,以便下一个作业变得可用,而不会在一个完全不会暂停的紧密循环中失控 - 即使没有什么可做的。

附录:

  1. shell 脚本将根据需要运行任意多次。 (该链接显示了如何根据需要重新运行它exec $@)。每当 php 脚本退出时,它都会重新运行 PHP。
  2. 显然有一个 Djanjo 应用程序可以显示一些统计数据,但它足以连接到守护进程,获取管列表,然后获取每个管的统计数据 - 或者只是计数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PHP 设置 Beanstalkd 的相关文章

随机推荐