3

我的 Beanstalkd 设置有问题。我创建了一个生产者,但它一直在加载,就像一个无限循环。我也将此问题发布到 GitHub

我尝试添加 2 个具有简单数组的管子,但我遇到的另一个问题是,当我使用管子的名称时,它没有我期望的值:它总是在旧管子上获得值。

<?php 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require("vendor/autoload.php");
function p($s){
    echo "<pre>";
    print_r($s);
    echo "</pre>";
}
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk('127.0.0.1');  //initiating an object
$watches = $pheanstalk->watch("ashimatube103613");
if ($pheanstalk->getConnection()->isServiceListening() == true) {  
    p($job = $pheanstalk->reserve());  
    while($job = $pheanstalk->reserve()) {
        $getdata = $job->getData();     
        p($getdata);
        echo 'test this is ';   
        $pheanstalk->delete($job);
    } 
}
$start  = $pheanstalk->getConnection()->isServiceListening(); // true or false
echo $start."listening";
try {
    # $job = $pheanstalk->reserve();
    # p($job->getData());
    echo 'here test';
} catch (Exception $e) {
    echo "Error sending message - {$e->getMessage()} \n";
}

我做错了什么?

这是我的生产者代码:producer.php

<?php 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
#echo phpinfo();
require("vendor/autoload.php");

function p($s){
    echo "<pre>";
    print_r($s);
    echo "</pre>";
}
use Pheanstalk\Pheanstalk;


$pheanstalk = new Pheanstalk('127.0.0.1');  //initiating an object

$args = array(
    "date" => "2017-1-17",
    "id"=>array("7","8","39","4")
);

#producer
$put = $pheanstalk->useTube("ashimatube103613")->put(json_encode(array($args)));
exit();
4

1 回答 1

0

你可能想要一个无限循环。许多工人/侦听器的示例代码都有无限循环,这可能是实现目标的最简单方法。它不应该通过网络服务器运行,因此它不受 Apache 或 Nginx 超时限制的限制:这段代码可以永远有效地运行。它可能应该。它需要不断地观察队列,以便它始终知道它可以处理的新任务何时到达。

Dayle Rees 有一个关于消息队列的简短教程(不是专门针对 Beanstalkd),它很好地解释了这一点。


但是,如果您编辑正在运行的 PHP 代码,这些更改将在执行完成之前生效。下次调用代码时,它将运行您的新代码。因此,无限运行的代码使部署变得困难。您需要以某种方式停止它,然后重新启动它,以使部署的更改生效。

因此,一种替代方法是让您的侦听器在处理完每个作业后退出(以及在给定时间长度后没有要处理的作业),并使用Supervisor或一些类似的系统来管理该进程,确保它每次都重新启动停止。这是Sitepoint 上的教程所采用的方法。

$job = $queue->reserve(60 * 5);

这将在作业可用或五分钟后立即返回。如果$job是job,我们做job定义给我们做的工作,然后退出;如果$jobfalse,我们直接退出,因为我们无事可做。无论哪种方式,Supervisor 的工作都是确保脚本再次启动。如果需要,还可以将 Supervisor 配置为运行脚本的多个实例。

Supervisor 方法当然具有更大的灵活性,但代价是增加了初始设置的难度,除非您已经熟悉 Supervisor。(请注意,Supervisor 不是唯一可以像这样管理其他脚本的程序。)

于 2019-12-04T17:40:57.870 回答