【问题标题】:Laravel Broadcast Event not firingLaravel 广播事件未触发
【发布时间】:2017-09-09 10:49:21
【问题描述】:

每次创建新的市场快照时,我都会尝试广播一个事件。我跟着 laravel 教程here.

但我似乎遗漏了一些东西,因为甚至没有创建日志:

    namespace App\Events;

    use Illuminate\Broadcasting\Channel;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Broadcasting\PrivateChannel;
    use Illuminate\Broadcasting\PresenceChannel;
    use Illuminate\Foundation\Events\Dispatchable;
    use Illuminate\Broadcasting\InteractsWithSockets;
    use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

    class NewMarketSnapshot implements ShouldBroadcast
    {
        use Dispatchable, InteractsWithSockets, SerializesModels;

        /**
         * Create a new event instance.
         *
         * @return void
         */
        public function __construct()
        {
            //
        }

        /**
         * Get the channels the event should broadcast on.
         *
         * @return Channel|array
         */
        public function broadcastOn()
        {
            \Log::info('event broadcasted');

            return new Channel('snapshot');
        }
    }

我什至在 EventServiceProvider 中注册了事件(laravel 链接中没有提到)

protected $listen = [
    'App\Events\NewMarketSnapshot' => [
      'App\Listeners\NewMarketSnapshotListener',
    ],
];

正在调用处理程序,但未广播事件。

    namespace App\Listeners;

    use App\Events\NewMarketSnapshot;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use \Log;

    class NewMarketSnapshotListener
    {
        /**
         * Create the event listener.
         *
         * @return void
         */
        public function __construct()
        {
            //
        }

        /**
         * Handle the event.
         *
         * @param  NewMarketSnapshot  $event
         * @return void
         */
        public function handle(NewMarketSnapshot $event)
        {
            Log::info('handler called.');
        }
    }

使用简单路线进行测试:

Route::get('/test', function(){
    $snapshot = ['USD'=>100];
    return event(new App\Events\NewMarketSnapshot($snapshot));
});

我的 .env 文件中的行

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

【问题讨论】:

  • 你用的是什么广播公司?pusher?
  • 不...使用redis
  • 你能分享你的 .env 文件吗?这可能会有所帮助。
  • 刚刚编辑成问题

标签: php laravel events laravel-5


【解决方案1】:

我注意到您使用 Redis 作为队列和广播驱动程序。我的经验是,同时使用它会破坏广播(基本上它会在广播事件中向 Redis 发送错误的命令)。

如果您将队列切换到不同的驱动程序或使用单独的 Redis 实例,它应该可以正常工作。

编辑:我相信在这种情况下它使用 Redis RPUSH 命令,而它应该使用 PUBLISH,因此订阅者永远不会选择它。

EDIT2:不要忘记清除任何缓存的配置 “php工匠配置:清除”

【讨论】:

  • 让我尝试为队列驱动程序切换到“同步”。
  • @TechyTimo 我不记得确切的区别是什么,但是如果您运行redis-cli monitor 然后使用两个不同的配置设置触发事件,那么如果有区别,您应该在那里看到它。
  • 不过,请记住,这是我在 Laravel 5.2 中体验过的,所以它不再是问题并非不可能......
  • 另外,不要忘记使用php artisan config:clear清除任何缓存的配置
  • 哦!终于可以播出啦! "php artisan config:clear" 已解决。非常感谢!
【解决方案2】:

我遇到了类似的问题,即使我在开始时测试了 pusher 并且一切正常,一切都设置正确。问题是,我将 QUEUE_CONNECTION 切换到 database 以使用 Laravel 的队列系统异步发送电子邮件。
因此,有效的解决方案是 implements ShouldBroadcastNow 我的活动为
class NewNotificationEvent implements ShouldBroadcastNow 并且一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2018-03-08
    • 2022-10-24
    相关资源
    最近更新 更多