laravel echoのブロードキャスターとしてsocket.ioに問題があります。
私は何を試しましたか:
php artisan cache:clear
php artisan config:clear
ログ内で接続しているユーザーを確認できます。
0|Socket-Connection | [11:17:00 AM] - ********** joined channel: test-channel
0|Socket-Connection | [11:17:01 AM] - ********** authenticated for: private-user.1
0|Socket-Connection | [11:17:01 AM] - ********** joined channel: private-user.1
キューが実行されており、すべてのイベントが適切にログに記録されています。
Redisコンソールでイベントとデータベース通知を完全にredisで確認できます。
しかし、イベントはブロードキャストされず、laravel-echo-serverコンソールに表示されません。すべてが私のローカルホストで機能していますが、本番環境では機能しておらず、気が狂っています。
これが私のlaravel echo JS:
if (typeof io !== 'undefined') {
console.log(window.location.Origin);
window.Echo = new Echo({
broadcaster: 'socket.io',
Host: window.location.Origin + ':6001',
auth: {
headers: {
Authorization: 'Bearer ' + bearerToken,
},
}
});
window.Echo.private('user.' + user_id).notification((notification) => {
console.log(notification);
});
}
私のユーザーモデルでは、これを定義しました:
/**
* @return string
*/
public function receivesBroadcastNotificationsOn()
{
return 'user.' . $this->id;
}
そして私のチャンネルにはこれがあります:
Broadcast::channel('user.{id}', function ($user, $id) {
return (int)$user->id === (int)$id;
});
これは、すべてのパスが正しい私のエコーサーバー構成です。ローカルホストで同じファイルをテストしましたが、すべてが機能しています。
var echo = require('laravel-echo-server/dist');
echo.run({
"appKey": "myappkey",
"authHost": "https://url",
"authEndpoint": "/broadcasting/auth",
"database": "redis",
"clients": [
{
"appId": "myappid",
"key": "mykey"
}
],
"databaseConfig": {
"redis": {
"port": "6379",
"Host": "myhost",
"password": "mysupersecretpassword"
},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": true,
"Host": "url",
"port": "6001",
"protocol": "https",
"referrers": [],
"sslCertPath": "/path/to/certificate.pem",
"sslKeyPath": "/path/to/key",
"verifyAuthPath": true,
"verifyAuthServer": false
});
データベース通知を公開すると、私のredisログにこれが表示されます
1534840681.110359 [0 "IP ADDRESS HERE"] "PUBLISH" "private-user.2" "{\"event\":\"Illuminate\\\\Notifications\\\\Events\\\\BroadcastNotificationCreated\",\"data\":{\"title\":\"Ravim CONVULEX 50MG\\/ML staatust muudeti\",\"notification_type\":\"element-soft-delete\",\"message\":\"Ravimi CONVULEX 50MG\\/ML staatust muutis kasutaja Kalle \",\"url\":\"https:\\/\\/www.app.riskomed.com\\/admin\\/brands\\/all\",\"id\":\"30c37d0d-c39b-41bf-93fc-afa0c78ca9db\",\"type\":\"App\\\\Notifications\\\\API\\\\Management\\\\Medical\\\\Brands\\\\BrandSoftDeleteNotification\",\"socket\":null},\"socket\":null}"
これは私の通知です
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail', 'database', 'broadcast'];
}
ご覧のとおり、prodactionサーバーで「https」プロトコルを使用しているため、「sslCertPath」と「sslKeyPath」を定義する必要があります。
ドキュメントから
SSLで実行
ユーザーがチャンネルに参加しているのを見ている場合は、正しく設定されている可能性があります。特にユーザーチャネルで通知関数を呼び出しているため、console.log(notification)
呼び出しが機能するように通知をブロードキャストする必要があります。詳細については、 https://laravel.com/docs/5.6/broadcasting#notifications を参照してください。
通知付きでブロードキャスト:
//Create a new notification with artisan, e.g. php artisan make:notification testNotification
class testNotification extends Notification {
...
public function via($notifiable)
{
return ['broadcast'];
}
...
public function toBroadcast($notifiable) {
return new BroadcastMessage([
'message' => 'TEST',
]);
}
}
次に、メッセージをブロードキャストする準備ができたら、ユーザーに通知します。
$user->notify(new testNotification());
編集:
また、ユーザーモデルにNotifiable
特性があることを確認してください。
class User extends Authenticatable
{
use Notifiable;
...
}