环境:Mac ,laravel版本 5.2.x ,valet
问题描述:
在用laravel配合nodeJS的socket.io做websocket时出现的错误。
这是socket的服务端代码
var http = require('http').Server();
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('test-channel');
redis.on('message', function (channel, message) {
console.log(message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3001, function () {
console.log('Server is running at 3001!');
});
这是route代码
Route::get('/test', function () {
$data = [
'event' => 'inbox',
'data' => [
'name' => 'WTF'
]
];
Redis::publish('test-channel', json_encode($data));
return 'Done';
});
然后访问/test页面后,命令行显示如图:
前端也收到了数据,就不展示了,问题的关键在于
当我将route的代码改成如下:
Route::get('/test', function () {
event(new \App\Events\Test('ARE U OK ?'));
return 'Done';
});
然后通过
php artisan make:event Test
生成的event事件代码如下:
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class Test extends Event implements ShouldBroadcast
{
use SerializesModels;
public $name;
public function __construct($name)
{
$this->name = $name;
}
public function broadcastOn()
{
return ['test-channel'];
}
}
然后访问/test页面,命令行无输出。
在这之前,是配置过broadcast的driver的
.env文件里
BROADCAST_DRIVER=redis
config的cache也已经clear过了
从使用Redis::publish成功可以看出,laravel和Redis链接是成功的,那么问题应该出在哪里呢?
还请大神指教!
プロジェクトを再度開き、同じコードをコピーして通常どおり実行した後、問題の原因は元のプロジェクトの QUEUE_DRIVER=redis であることがわかり、キューの問題であるはずです。
QUEUE_DRIVER=redis を同期するように変更します。
ご招待いただきありがとうございます。 ざっとコードを見たところ、特に問題はなさそうです。しかし、説明されていないことが 1 つあります。それは、キューの実行に問題があるかどうかです。
イベントをブロードキャストすると、イベントが実行のためにキューに入れられます。キュー監視を開始していませんか?
まず、イベント内の
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
を次のNow
に変更してみます。use Illuminate\Contracts\ に変更します。ブロードキャスト \ShouldBroadcastNow;
次に、ブロードキャストできるかどうかをテストします。可能であれば、Now を削除して元に戻し、ブロードキャストする前にコマンドラインで
phpArtisan queue:listen
を実行してください。