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 上看到
本作品采用《CC 协议》,转载必须注明作者和本文链接
顺带打个广告 一个基于redis laravel echo没用pusher 的聊天室demo
pusher 接收到消息后。然后告诉网站向其他人推送消息。这一过程本地是不是无法接收到pusher的消息,线上才可以。
@jc91715 如果使用pusher的话, 本地是无法接收到的, 消息是发送到pusher服务器上的。 还有另一种方法就是自己开一个端口,监听频道及事件,那么消息就是在本地接受并由本地发送了。
@daidailin
我这消息是发送到pusher服务器上的。然而我在本地可以更新。感到有点迷惑,我把消息发送到pusher服务器,我是在本地开发,按理说pusher不能返回信息到本地,也就不能触发更新了。那本地是如何触发并更新的,如果不需要pusher本地就可以更新的话,那发送到pusher的意义就没有了
pusher 被墙了,你们还能用吗
@xcaptain 我没用pusher了 后面换成websocket了.
@xcaptain 我发现使用swoole扩展 是个很不错的选择。 你可以试下。
我发现只是js的cdn被屏蔽了,我换成cloudfire的cdn之后能正常使用。自己搭推送服务太费劲了,我先试试pusher
我照着你写的步骤来,最后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] 然后就卡在这里了。好难啊。。。
回复排版好尴尬。。。
好吧 好像你也好久没用这个了 我再看看 不行就放弃了
@zionhuang 有执行composer require pusher/pusher-php-server 这句么
@daidailin 执行了呢 vendor里面已经有pusher了
@zionhuang 没遇到过, 我当初发布文章的时候 我用laravel5.4 执行了一遍才丢上来的。 有没有可能版本不会, laravel5.3跟laravel5.4的还是有点区别的
@daidailin 有可能
@daidailin 我终于成功了 踩了无数坑。。。。
@zionhuang :smile:
@zionhuang 可以分享一下吗? 遇到跟你之前踩过的一模一样的坑.....
@康师傅 你是说的这个问题吗?
一种方法是在 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上注册的那个)
我就是做完这些之后就可以把消息push到Pusher上面了
@zionhuang 报了一个 local.ERROR: exception 'Illuminate\Broadcasting\BroadcastException ....头皮发麻
@康师傅
'options' => [
'cluster' => 'eu',
//'encrypted' => true,
],
这样之后还是这样?
@zionhuang 对啊.... 打算换 redis了 不用pusher
@康师傅 是有很多坑 我一个demo现在也没有实现出来
@康师傅 我的问题好像跟你的一样,按照楼上所说去掉encrypted成功了
执行成功,有回显,但是pusher并没有。请问这个要怎么排错?