php:queue / dont延迟用户

时间:2013-07-22 09:51:37

标签: php queue

我有一段代码需要一段时间才能运行并且优先级较低。我想知道在PHP中我是否可以做类似

的事情
public function put () {

  $comment = array('title' => 'my title', 'description' => 'my description');

  sendtoQueue($this->internalCall('controller' => 'Comment', 'data' => $comment);

  $object = $this->get('id' => $this->id);
  return $object;
}

sendToQueue中的函数不会延迟正在获取和返回的$对象,并且将在BG中运行。

可能?我知道我可以把它扔给python但理想情况下我希望它能在当前范围内运行。

3 个答案:

答案 0 :(得分:1)

您可以使用exec启动一个新的php进程,该进程在后台运行脚本并使sendToQueue返回。

您还可以使用beanstalkD之类的解决方案。 sendtoQueue将数据推送到Beanstalk并让工作人员在后台清空队列

答案 1 :(得分:1)

如果你需要它在当前范围内运行而不是fork(pcntl_fork())一个进程,让子进程在父进程时进行处理

否则,只需定期运行一个清空任务队列的脚本。

答案 2 :(得分:0)

这是您可以使用enqueue库轻松完成的操作。首先,您可以选择各种传输,例如AMQP,STOMP,Redis,Amazon SQS,Filesystem等。

其次,这非常容易使用。让我们从安装开始:

您必须安装enqueue/simple-client库和one of the transports。假设您选择了一个文件系统,请安装enqueue/fs库。总结一下:

composer require enqueue/simple-client enqueue/fs 

现在让我们看看如何从POST脚本发送消息:

<?php
// producer.php

use Enqueue\SimpleClient\SimpleClient;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://'); // the queue will store messages in tmp folder

$client->sendEvent('a_topic', 'aMessageData');

消费脚本:

<?php
// consumer.php

use Enqueue\SimpleClient\SimpleClient;
use Enqueue\Psr\PsrProcessor;
use Enqueue\Psr\PsrMessage;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://');

$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) {
   // processing logic here

   return PsrProcessor::ACK;
});

// this call is optional but it worth to mention it.
// it configures a broker, for example it can create queues and excanges on RabbitMQ side. 
$client->setupBroker();

$client->consume();

使用supervisord或其他进程管理器运行尽可能多的consumer.php进程,在本地计算机上运行它,无需任何额外的库或包。

这是一个基本的例子,enqueue还有很多其他功能可以派上用场。如果您有兴趣,请查看enqueue documentation