2017-09-27 210 views
0

我在一个项目中使用Laravel,我想用laravel-echo-server和Redis来使用广播。我已经建立了一个码头集装箱。下面的输出:广播,laravel-echo-server没有收到事件

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?任何我想念或遗忘的东西?

+0

你是否在.env中更改了广播驱动程序? –

+0

是的,我已经更新了我的问题,以显示我的.env – Snackoverflow

+0

的相关代码是否排入队列:工作过程是什么?它似乎失败了。也许你可以尝试改变你的队列驱动程序来首先同步,看看有没有处理队列的错误 –

回答