如何使用PHP设置Beanstalkd

jos*_*lat 12 php bash daemon message-queue beanstalkd

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

以下是我看到它的工作方式:

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

    #!/bin/sh
    php worker.php
    
    Run Code Online (Sandbox Code Playgroud)

4)worker脚本会有类似的东西来执行排队的任务:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 假设我有将RSS源导入数据库或其他任务的任务.如果10个用户同时执行此操作,则他们将全部排在"测试"管中.但是,它们只能一次执行一个.将10个不同的管同时执行会更好吗?

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

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

谢谢!

Ali*_*man 5

  1. 如果工人没有花太长时间来取食,那就没关系了.如果需要一次处理多个工作人员,您可以运行多个工作人员.我有一个系统(目前正在使用Amazon SQS,但之前我已经完成了类似的BeanstalkD),最多有200名(或更多)工作人员从队列中撤出.
  2. 单个工作者脚本(同一个脚本运行多次)应该没问题 - 脚本可以同时观察多个管,并且第一个可用的脚将被保留.您还可以使用该job-stat命令查看特定$作业的来源(哪个管),或者如果您需要从另一个类别告诉每个类型,则将一些元信息放入消息中.
  3. 这里描述了运行worker的一个很好的例子.我还添加了supervisord(也是一个有用的帖子开始),可以轻松启动并保持每台机器运行一些工作程序(我运行shell脚本,如第一个链接).我会限制它循环的次数,并且还要设置一个数字reserve()让它等待几秒或更长时间,以便下一个工作变得可用,而不会在一个不停顿的紧密循环中失去控制所有 - 即使没有任何事情可做.

附录:

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