web-dev-qa-db-ja.com

Laravelエコーサーバーが本番サーバーで機能していません

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'];
    }
10
z0mbieKale

ご覧のとおり、prodactionサーバーで「https」プロトコルを使用しているため、「sslCertPath」と「sslKeyPath」を定義する必要があります。

ドキュメントから

SSLで実行

  • クライアント側の実装は、httpsからsocket.ioクライアントにアクセスする必要があります。
  • サーバー構成では、httpsを使用するようにサーバーホストを設定する必要があります。
  • サーバー構成には、サーバーにあるSSL証明書とキーの両方へのパスを含める必要があります。
1

ユーザーがチャンネルに参加しているのを見ている場合は、正しく設定されている可能性があります。特にユーザーチャネルで通知関数を呼び出しているため、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;

    ...
}
1
JPark