Laravel5.4,广播事件,pusher 的配置以及使用

最近要写一个聊天室,于是了解了一下laravel的事件广播,参考资料来源于http://laravelacademy.org/post/5351.html, 但是在跟随博主动手的时候, 发现事件成功触发, 但是pusher调试控制台上并没有收到事件。经过调试找到问题所在。

首先我们先创建一个事件:

php artisan make:event TestEvent

最终, 事件的代码如下, 这里有一个注意点就是

如果该事件没有继承use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 接口,那么触发事件,将不会发送事件至pusher 服务器上.

use ...
// 如果该事件没有继承use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 接口,那么触发事件,将不会发送事件至pusher 服务器上.
class TestEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    // 类型需为public 
    public $msg;

    public function __construct($msg)
    {
        $this->msg = $msg;
    }

    public function broadcastOn()
    {
        return [
            'test'
        ];
    }
}

为了测试方便,我们创建一个artisan 命令来触发事件.

php artisan make:command TestEventCommand

打开命令类 app/Console/Commands/TestEventCommand.php 编辑后如下

    class TestEventCommand extends Command
{

    protected $signature = 'pusher:test {message}';
    protected $description = 'pusher test';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        event(new \App\Events\TestEvent($this->argument('message')));
    }
}

打开 app/Console/Kernel.php, 将刚创建的命令类添加至 $commands

    protected $commands = [
        Commands\TestEventCommand::class,
    ];

事件代码基本完成, 接下来导入pusher

composer require pusher/pusher-php-server

当pusher 成功导入之后 需要在env中配置, BROADCAST_DRIVER 需配置为pusher。 config/broadcasting.php 文件 BROADCAST_DRIVER 默认为null

  • PUSHER_APP_ID=you_app_id
  • PUSHER_APP_KEY=you_app_key
  • PUSHER_APP_SECRET=you_app_secret
  • BROADCAST_DRIVER = pusher
    另外在这里测试发现如果 QUEUE_DRIVER 配置是redis 那么当触发事件的时候不会调用Illuminate\Broadcasting\BroadcastManager 下的createPusherDriver方法.也就是不生成pusher类发送事件. QUEUE_DRIVER应配置为sync

    配置完成之后 我们就可以通过artisan 命令向pusher服务器发送事件,

    php artisan pusher:test "hello"

    那么,将会在pusher debug-console 上看到
    file

本作品采用《CC 协议》,转载必须注明作者和本文链接
时间似水流逝,智慧与日俱增。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 25
jcc123

pusher 接收到消息后。然后告诉网站向其他人推送消息。这一过程本地是不是无法接收到pusher的消息,线上才可以。

6年前 评论

@jc91715 如果使用pusher的话, 本地是无法接收到的, 消息是发送到pusher服务器上的。 还有另一种方法就是自己开一个端口,监听频道及事件,那么消息就是在本地接受并由本地发送了。

6年前 评论
jcc123

@daidailin

file

我这消息是发送到pusher服务器上的。然而我在本地可以更新。感到有点迷惑,我把消息发送到pusher服务器,我是在本地开发,按理说pusher不能返回信息到本地,也就不能触发更新了。那本地是如何触发并更新的,如果不需要pusher本地就可以更新的话,那发送到pusher的意义就没有了

6年前 评论
xcaptain

pusher 被墙了,你们还能用吗

6年前 评论

@xcaptain 我没用pusher了 后面换成websocket了.

6年前 评论

@xcaptain 我发现使用swoole扩展 是个很不错的选择。 你可以试下。

6年前 评论
xcaptain

我发现只是js的cdn被屏蔽了,我换成cloudfire的cdn之后能正常使用。自己搭推送服务太费劲了,我先试试pusher

6年前 评论

我照着你写的步骤来,最后php artisan pusher:test "hello"的时候
先是出现错误
[Symfony\Component\Debug\Exception\FatalErrorException]
Class 'Pusher' not found 我按https://stackoverflow.com/questions/45052853/class-pusher-not-found 这里的解决方案加了alias 'Pusher' => Pusher\Pusher::class, 之后又出现 [Illuminate\Broadcasting\BroadcastException]
Unknown auth_key
我又按照 https://github.com/laravel/framework/issue... 这里的解决方案加了 'options' => [
'cluster' => 'eu',
'encrypted' => true,
], 现在没有Unkown auth_key了 但还是报这个错误[Illuminate\Broadcasting\BroadcastException] 然后就卡在这里了。好难啊。。。

6年前 评论

回复排版好尴尬。。。

6年前 评论

好吧 好像你也好久没用这个了 我再看看 不行就放弃了

6年前 评论

@zionhuang 有执行composer require pusher/pusher-php-server 这句么

6年前 评论

@daidailin 执行了呢 vendor里面已经有pusher了

6年前 评论

@zionhuang 没遇到过, 我当初发布文章的时候 我用laravel5.4 执行了一遍才丢上来的。 有没有可能版本不会, laravel5.3跟laravel5.4的还是有点区别的

6年前 评论

@daidailin 我终于成功了 踩了无数坑。。。。

6年前 评论

@zionhuang 可以分享一下吗? 遇到跟你之前踩过的一模一样的坑.....

6年前 评论

@康师傅 你是说的这个问题吗?

[Symfony\Component\Debug\Exception\FatalErrorException] Class 'Pusher' not found

一种方法是在 config/app.php 里面的alias那里加上一行 'Pusher' => Pusher\Pusher::class,这样就可以找到pusher了。

还有一种对我有效的是把执行的 composer require pusher/pusher-php-server 换成 composer require "pusher/pusher-php-server": "^2.5.0"

后续应该还会有一个错误,我是把config\broadcasting.php 里 pusher的options改成下面那样,如果改完还有错,就把encryted那行注释掉(cluster记得改成你在pusher上注册的那个)

'pusher' => [
        'driver' => 'pusher',
        'key' => env('PUSHER_APP_KEY'),
        'secret' => env('PUSHER_APP_SECRET'),
        'app_id' => env('PUSHER_APP_ID'),
        'options' => [
          'cluster' => 'eu',
          'encrypted' => true,
        ],

我就是做完这些之后就可以把消息push到Pusher上面了

6年前 评论

@zionhuang 报了一个 local.ERROR: exception 'Illuminate\Broadcasting\BroadcastException ....头皮发麻

6年前 评论

@康师傅
'options' => [
'cluster' => 'eu',
//'encrypted' => true,
],

这样之后还是这样?

6年前 评论

@zionhuang 对啊.... 打算换 redis了 不用pusher

6年前 评论

@康师傅 是有很多坑 我一个demo现在也没有实现出来

6年前 评论

@康师傅 我的问题好像跟你的一样,按照楼上所说去掉encrypted成功了

4年前 评论

执行成功,有回显,但是pusher并没有。请问这个要怎么排错?

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!