我在Ubuntu服务器上设置Phean秸秆时遇到了麻烦。我对编程比较陌生,我做了所有的步骤:-用sudo apt安装豆秆-从https://github.com/pda/pheanstalk/获得安装豆茎
这是我的密码:
require_once('pheanstalk_init.php');
$pheanstalk = new Pheanstalk_Pheanstalk('127.0.0.1');
$pheanstalk
->useTube('testtube')
->put(exec("cat ../uploads/databases/app_data/Filename.sql | sqlite3 ../uploads/databases/Filename.sqlite"));
$job = $pheanstalk
->watch('testtube')
->ignore('default')
->reserve();
echo $job->getData();
$pheanstalk->delete($job);问题是运行这段代码需要4到5分钟,出于某种原因,exec命令没有在后台运行。
对我做错了什么有什么想法吗?事先非常感谢!
发布于 2014-03-27 08:29:22
这是个老问题,你可能已经解决了.总之,这里有一个简短的答案和更详细的解释:
TL;DR :简单的回答:问题是,您在put()方法中运行(cpu/disk )密集型代码,并且需要在$job>getData()之后在worker中运行它。
说明:Bean秸秆充当消息队列,允许您将信息生产者与消费者分离开来。这样做的想法是,您只需要将您想要完成的任务的描述发布到队列中,生成该描述并将其发布到队列中非常快速。消耗处理的实际资源(CPU/RAM/磁盘IO/网络)发生在使用者(工作人员)中,当有可用资源时,生产者可以自由地做其他事情。如果没有可用的工人,那么这些工作就会堆积在队列中。
因此,在您的例子中,例如,将生产者和消费者分离为chief.php和worker.php:
chief.php
<?php
require_once('pheanstalk_init.php');
$pheanstalk = new Pheanstalk_Pheanstalk('127.0.0.1');
$pheanstalk
->useTube('testtube')
->put("cat ../uploads/databases/app_data/Filename.sql | sqlite3 ../uploads/databases/Filename.sqlite");
?>worker.php:
<?php
require_once('pheanstalk_init.php');
$pheanstalk = new Pheanstalk_Pheanstalk('127.0.0.1');
while(true){
$job = $pheanstalk->watch('testtube')->ignore('default')->reserve();
$cmd = $job->getData();
exec($cmd);
$pheanstalk->delete($job);
}
?>因此,当您运行一个工作程序时,它将连接到beanstalkd服务器,并等待一个作业被发布到'testtube‘队列/管上。然后,它将完成所描述的工作,并将其从队列中删除,并循环,以便在它到达时处理另一个作业。如果你愿意的话,你也可以并行运行几个工人。
注意:beanstalkd服务器不运行您的工人;它只将作业从生产者分配给消费者。因此,您需要自己管理正在运行的worker进程。我个人更喜欢将工作人员作为runit服务运行,这样当他们有任何问题时,他们将被runit重新启动,他们的输出将被记录下来。当然,您可以使用任何您喜欢的进程监视工具:runit、systemd、monit等等。
在您最喜欢的进程监视器下运行beanstalkd本身也是个好主意,以防它崩溃,这是不太可能的,但可能会发生(一年前我就遇到过这种情况)。
https://stackoverflow.com/questions/22095874
复制相似问题