2017-09-27 231 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

的相關代碼是否排入隊列:工作過程是什麼?它似乎失敗了。也許你可以嘗試改變你的隊列驅動程序來首先同步,看看有沒有處理隊列的錯誤 –

回答