0

我有一段代码需要一段时间才能运行并且优先级较低。我想知道在 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 中的函数不会延迟 $object 的获取和返回,并将在 BG 中运行。

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

4

3 回答 3

1

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

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

于 2013-07-22T09:57:40.680 回答
1

如果您需要它在当前范围内运行,则可以分叉(pcntl_fork())一个进程并让子进程在父进程继续时处理它

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

于 2013-07-22T10:02:54.023 回答
0

这是您可以使用enqueue库轻松完成的事情。首先,您可以从多种传输方式中进行选择,例如 AMQP、STOMP、Redis、Amazon SQS、Filesystem 等。

其次,它超级好用。让我们从安装开始:

您必须安装enqueue/simple-client库和传输之一。假设您选择文件系统之一,请安装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();

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

这是一个基本示例,并且 enqueue 有许多其他功能可能会派上用场。如果您有兴趣,请查看入队文档

于 2017-06-22T10:05:24.213 回答