Beanstalk总是有无限循环php

时间:2017-01-17 05:19:25

标签: php beanstalkd pheanstalk

大家好,任何人都可以指出我做错了什么。在我的beanstalk中,我创建了一个生产者,代码将会像这样。

https://github.com/pda/pheanstalk/issues/159

我有一个问题为什么它来到这个我尝试添加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();

1 个答案:

答案 0 :(得分:0)

您可能想要无限循环。用于工作者/侦听器的许多示例代码都有无限循环,这可能是实现目标的最简单方法。它不应该在网络服务器上运行,因此不受Apache或Nginx的超时限制的约束:此代码可以永远有效地运行。而且可能应该。它需要经常监视队列,以便它始终知道何时有新任务可以处理。

Dayle Rees has a short tutorial on message queues(不在Beanstalkd上特别介绍),这很好地解释了这一点。


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

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

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

这将在有工作时或五分钟后返回。如果$job是一项工作,则我们执行该工作定义的工作,然后退出;如果$jobfalse,我们无所事事就立即退出。无论哪种方式,Supervisor的工作都是确保再次启动脚本。如果需要,还可以将Supervisor配置为运行脚本的多个实例。

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