【发布时间】:2019-03-27 15:27:50
【问题描述】:
我总共有 2 个简单的问题。我目前正在研究 Laravel 中的一些事件处理,并希望使用 RabbitMQ 作为我的事件存储。因此我安装了这个包开始:https://github.com/php-enqueue/enqueue-dev
首先我注册了它,我可以将消息推送到 RabbitMQ:
$job = (new Sendemail())->onQueue('email')->onConnection('interop');
dispatch($job);
但问题是 Laravel 将某种格式推送到队列中,我不知道如何更改它。示例消息是:
{
"job":"Illuminate\\\\Queue\\\\CallQueuedHandler@call",
"data":{
"command":"O:29:\\"Acme\\Jobs\\FooJob\\":4:{s:11:\\"fooBar\\";s:7:\\"abc-123\\";s:5:\\"queue\\";N;s:5:\\"delay\\";N;s:6:\\"\\u0000*\\u0000job\\";N;}"
}
}
所以问题是,我该如何改变呢?主要原因是消费者端甚至不是PHP应用程序,也无法解释PHP序列化模型。因此,我正在寻找一种方法来推送纯 JSON 对象。
另一方面,我也想了解如何构建自定义侦听器?对于听众来说,同样的事情也会发生。 Laravel 尝试读取该方法,但是当我推送纯 JSON 时,这将永远无法工作。有没有办法在主题上注册处理程序并在处理程序本身内进一步处理消息的有效负载?
【问题讨论】:
-
类似
dispatch(deserialize($job->getData())) -
Dispatch 需要一个对象。反序列化不是有效的 php 函数,作业没有可用的 getData 方法?
-
另一个要考虑的选项,因为 Laravel 队列基础设施的主要目的是让 Laravel 发送和处理作业,直接使用 php-amqplib。然后,您可以完全控制推送到队列中的内容。
-
根据您的语言,有一些库可以反序列化由 PHP 的序列化函数创建的内容:npmjs.com/package/php-unserialize