我有一段代码需要一段时间才能运行并且优先级较低。我想知道在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但理想情况下我希望它能在当前范围内运行。
答案 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。