如何使用 PHP 设置 Beanstalkd

Posted

技术标签:

【中文标题】如何使用 PHP 设置 Beanstalkd【英文标题】:How to set up Beanstalkd with PHP 【发布时间】:2011-12-05 13:04:34 【问题描述】:

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

我认为它是这样工作的:

    我在我的 Ubuntu 服务器上安装了 Beanstalkd 和任何依赖项(例如 libevent)。然后我启动 Beanstalkd 守护进程(基本上应该一直运行)。 在我网站的某个地方(例如当用户执行某些操作时等),任务被添加到 Beanstalkd 队列中的各种管道中。

    我有一个 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);

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

    假设我有将 RSS 提要导入数据库或其他东西的任务。如果 10 个用户同时这样做,他们都会在“测试”管中排队。然而,他们一次只能被处决一个。让 10 个不同的管子同时执行会更好吗?

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

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

谢谢!

【问题讨论】:

【参考方案1】:
    如果工人没有花费太长时间来获取提要,那就没问题了。如果需要一次处理多个工作人员,您可以运行多个工作人员。我有一个系统(目前使用 Amazon SQS,但我之前使用 BeanstalkD 做过类似的事情),有多达 200 个(或更多)工作人员从队列中拉出。 单个工作脚本(同一个脚本运行多次)应该没问题 - 脚本可以同时观看多个管,并且将保留第一个可用的。您还可以使用 job-stat 命令查看特定 $job 来自哪里(哪个管),或者如果您需要区分每种类型,则将一些元信息放入消息中。 运行工作者的一个很好的例子是described here。我还添加了supervisord(还有一个useful post 以开始使用)以轻松启动并保持每台机器运行多个worker(我运行shell 脚本,如first link)。我会限制它循环的次数,并在reserve() 中输入一个数字,让它等待几秒钟或更长时间,以便下一个工作变得可用,而不会在一个紧密的循环中失去控制不要停下来——即使无事可做。

附录:

    shell 脚本可以根据需要运行多次。 (链接显示如何使用exec $@ 重新运行它)。每当 php 脚本退出时,它都会重新运行 PHP。 显然有一个 Djanjo 应用程序可以显示一些统计信息,但连接到守护程序、获取管道列表,然后获取每个管道的统计信息 - 或者只是计数,这已经足够简单了。

【讨论】:

感谢您的链接!我一定会调查这些。关于 #2 的问题:该脚本多久执行一次?这完全取决于守护进程执行 bash 脚本的频率吗? 另外,是否有任何方便的方法(通过代码 sn-p 或“仪表板”类型的东西)查看 beanstalk 的所有执行情况等? 大多数/所有库都应该提供对 stats、list-tubes 和 stat-tubes 命令的调用。还有一些其他的。我还没有看到github.com/andreisavu/django-jack 运行,但它也可以做一些事情。

以上是关于如何使用 PHP 设置 Beanstalkd的主要内容,如果未能解决你的问题,请参考以下文章

centos beanstalkd 安装 与php调用

Beanstalkd 消息队列

PHP7 生产环境队列 Beanstalkd 正确使用姿势

php-beanstalkd消息队列类分享

如何正确设置 Kohana 的 .htaccess,使 URL 中没有丑陋的“index.php/”?

如何使 windows 符号链接与 mod_php 一起工作?