gpt4 book ai didi

php - 如何使用 PHP 设置 Beanstalkd

转载 作者:行者123 更新时间:2023-11-29 08:49:34 27 4
gpt4 key购买 nike

最近我一直在研究 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. 如果我确实需要更多 pipe ,那是否也意味着我需要 10 个工作脚本?除了 watch() 函数中的字符串文字外,每个管都使用基本相同的代码同时运行。

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

谢谢!

最佳答案

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

附录:

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

关于php - 如何使用 PHP 设置 Beanstalkd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com