RedisBroadcaster在连接上为空

时间:2018-04-10 15:32:22

标签: laravel-5.3 publish-subscribe

我正在尝试使用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同步时,它可以工作。但是队列功能是不可替代的。

1 个答案:

答案 0 :(得分:0)

我不知道为什么实现使用ShouldBroadcast作为队列服务的beanstalkd会出现问题,但是当我实施ShouldBroadcastNow时,事件被触发并被监听websocket服务器?

为什么在redis上使用队列pubsub正在创建与redis的空连接?