我正在尝试使用Redis作为PUBSUB和socket.io作为nodjs websocket服务器使用Laravel 5.3进行事件广播。
当我调用redis publish命令时,websocket服务器会广播和处理该事件
\Redis::publish('channel-order-1', json_encode(['event' => 1, 'data'=>2]));
然而,当我尝试使用事件助手
触发它时event ( new Events\OrderStatusChanged(1))
我收到以下堆栈跟踪错误
[2018-04-10 15:16:27] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Call to a member function publish() on null in /var/www/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php:99 Stack trace: #0 /var/www/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php(52): Illuminate\Broadcasting\Broadcasters\RedisBroadcaster->broadcast(Array, 'App\\Events\\Orde...', '{"event":"App\\\\...') #1 /var/www/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(73): Illuminate\Broadcasting\BroadcastEvent->fire(Object(Illuminate\Queue\Jobs\BeanstalkdJob), Array) #2 /var/www/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(203): Illuminate\Queue\Jobs\Job->fire() #3 /var/www/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(153): Illuminate\Queue\Worker->process('beanstalkd', Object(Illuminate\Queue\Jobs\BeanstalkdJob), Object(Illuminate\Queue\WorkerOptions)) #4 /var/www/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(75): Illuminate\Queue\Worker->runNextJob('beanstalkd', 'high,low,defaul...', Object(Illuminate\Queue\WorkerOptions)) #5 /var/www/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(100): Illuminate\Queue\Worker->daemon('beanstalkd', 'high,low,defaul...', Object(Illuminate\Queue\WorkerOptions)) #6 /var/www/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(84): Illuminate\Queue\Console\WorkCommand->runWorker('beanstalkd', 'high,low,defaul...') #7 [internal function]: Illuminate\Queue\Console\WorkCommand->fire() #8 /var/www/vendor/laravel/framework/src/Illuminate/Container/Container.php(508): call_user_func_array(Array, Array) #9 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(169): Illuminate\Container\Container->call(Array) #10 /var/www/vendor/symfony/console/Command/Command.php(261): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #11 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(155): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #12 /var/www/vendor/symfony/console/Application.php(817): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #13 /var/www/vendor/symfony/console/Application.php(185): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #14 /var/www/vendor/symfony/console/Application.php(116): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #15 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(121): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #16 /var/www/artisan(35): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #17 {main} [] []
我的活动如下
<?php
namespace App\Events;
use App\Order;
use App\Repositories\Users\ClientRepo;
use App\ShopperDetail;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class OrderStatusChanged implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $payload;
public $channelSufix;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($orderId)
{
$order = Order::where('id', $orderId)->first();
$this->channelSufix = $orders->group;
$this->payload = $order;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return ['channel-order-' . $this->channelSufix];
}
}
修改
当我将队列驱动程序更改为从beanstalkd同步时,它可以工作。但是队列功能是不可替代的。
答案 0 :(得分:0)
我不知道为什么实现使用ShouldBroadcast
作为队列服务的beanstalkd
会出现问题,但是当我实施ShouldBroadcastNow
时,事件被触发并被监听websocket服务器?
为什么在redis上使用队列pubsub正在创建与redis的空连接?