广播,laravel-echo-server无法接收事件

时间:2017-09-27 07:03:41

标签: php laravel broadcast

我在项目中使用Laravel,我想使用laravel-echo-server和Redis进行广播。我已经在docker容器中设置了它们。输出如下:

Redis

    redis_1                | 1:C 27 Sep 06:24:35.521 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    redis_1                | 1:C 27 Sep 06:24:35.577 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=1, just started
    redis_1                | 1:C 27 Sep 06:24:35.577 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
    redis_1                | 1:M 27 Sep 06:24:35.635 * Running mode=standalone, port=6379.
    redis_1                | 1:M 27 Sep 06:24:35.635 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    redis_1                | 1:M 27 Sep 06:24:35.635 # Server initialized
    redis_1                | 1:M 27 Sep 06:24:35.635 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    redis_1                | 1:M 27 Sep 06:24:35.636 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
    redis_1                | 1:M 27 Sep 06:24:35.715 * DB loaded from disk: 0.079 seconds
    redis_1                | 1:M 27 Sep 06:24:35.715 * Ready to accept connections

一些警告,但没有任何破坏。

laravel-echo-server

laravel-echo-server_1  | L A R A V E L  E C H O  S E R V E R
laravel-echo-server_1  | 
laravel-echo-server_1  | version 1.3.1
laravel-echo-server_1  | 
laravel-echo-server_1  | ⚠ Starting server in DEV mode...
laravel-echo-server_1  | 
laravel-echo-server_1  | ✔  Running at localhost on port 6001
laravel-echo-server_1  | ✔  Channels are ready.
laravel-echo-server_1  | ✔  Listening for http events...
laravel-echo-server_1  | ✔  Listening for redis events...
laravel-echo-server_1  | 
laravel-echo-server_1  | Server ready!
laravel-echo-server_1  | 
laravel-echo-server_1  | [6:29:38 AM] - dG0sLqG9Aa9oVVePAAAA joined channel: office-dashboard

客户端似乎没有任何问题加入频道。 但是,如果我踢了一个事件laravel-echo-server没有收到该事件。

我做了一些研究,发现了一些关于队列工作者的事情。所以我决定运行它(php artisan queue:work),看看是否有任何作用。根据文档,它应该只运行队列中的第一个任务然后退出(而不是queue:listen)。果然它开始处理我之前踢过的事件。但是直到我杀了它才停止并继续前进:

[2017-09-27 08:33:51] Processing: App\Events\CompanyUpdated
[2017-09-27 08:33:51] Processing: App\Events\CompanyUpdated
[2017-09-27 08:33:51] Processing: App\Events\CompanyUpdated
[2017-09-27 08:33:51] Processing: App\Events\CompanyUpdated
etc..

redis容器中显示以下输出:

redis_1                | 1:M 27 Sep 06:39:01.562 * 10000 changes in 60 
seconds. Saving...
redis_1                | 1:M 27 Sep 06:39:01.562 * Background saving started by pid 19
redis_1                | 19:C 27 Sep 06:39:01.662 * DB saved on disk
redis_1                | 19:C 27 Sep 06:39:01.663 * RDB: 2 MB of memory used by copy-on-write
redis_1                | 1:M 27 Sep 06:39:01.762 * Background saving terminated with success

现在我要么做了很多api调用,队列太大了,或者出了什么问题。此外,laravel-echo-server在作业被“处理”后没有显示任何输出。

我在我的模型中创建了一个钩子,可以解释事件:

public function __construct(array $attributes = []) {
    parent::__construct($attributes);

    parent::created(function( $model ){
        //event(new CompanyCreated($model));
    });

    parent::updated(function( $model ){
        event(new CompanyUpdated($model));
    });

    parent::deleted(function( $model ){
        event(new CompanyDeleted($model));
    });
}

然后这是它开始的事件:

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

/**
 * Create a new event instance.
 *
 * @return void
 */
public function __construct(Company $company) {
    $this->company = $company;
}

/**
 * Get the channels the event should broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn() {
    return new Channel('office-dashboard');
}
}

最后,这是前端正在监听事件的代码:

window.Echo.channel('office-dashboard')
  .listen('CompanyUpdated', (e) => {
    console.log(e.company.name);
  });

.env档案:

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

REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

为什么事件没有传递给laravel-echo-server?我遗失或忘记了什么?

1 个答案:

答案 0 :(得分:1)

开始工作了。