当前位置: 首页 > 知识库问答 >
问题:

Laravel echo服务器在生产服务器中不工作

施洛城
2023-03-14

我的插座有问题。io作为一名广播员与laravel echo合作。

我试过什么:

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服务器控制台中看到它们。一切都在我的本地主机上运行,但在生产环境中没有,我失去了理智。

以下是我的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;
});

这是我的echo服务器配置,所有路径都正确。我在本地主机上测试了相同的文件,一切正常:

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

共有2个答案

李兴为
2023-03-14

如果您看到用户加入频道,则很可能设置正确。您只需要为控制台广播一个通知。日志(通知)call to work,因为您专门在用户频道上调用通知功能。看见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());

编辑:

此外,请确保您的用户模型中具有应呈报特征:

class User extends Authenticatable
{
    use Notifiable;

    ...
}
何承
2023-03-14

正如我看到的,您在prodaction服务器中使用“https”协议,因此需要定义“sslCertPath”和“sslKeyPath”:

来自文档

使用SSL运行

  • 客户端实现必须访问套接字。来自https的io客户端
  • 服务器配置必须将服务器主机设置为使用https
  • 服务器配置应包括指向服务器上ssl证书和密钥的路径
 类似资料:
  • 我正在尝试将大量文件从服务器A传输到服务器B。我已经在A上设置了FTP(使用FileZilla)。 当我尝试从PC连接到A时,它工作正常。但当我尝试从B连接到A时,它不起作用。FTP用户登录,但目录列表命令一直处于停滞状态。 防火墙端口21已打开。我尝试了多台服务器、不同的FTP客户端,但没有用。除了FileZilla,我还尝试了内置FTP服务的ISS,得到了相同的结果。 使用相同凭据从本地完美连

  • 我们团队决定尝试使用OpenShift Origin server部署服务。我们有一个单独的虚拟机,安装了OpenShift原始服务器,运行良好。我能够部署我们的本地docker映像,这些服务也运行良好——pod已启动并运行,获得了自己的IP,我可以从虚拟机访问服务endpoint。 问题是我无法让它工作,所以服务暴露在机器之外。我读到了路由器,它被认为是公开服务的正确方式,但它只是不起作用,现在

  • 问题内容: 我已经编写了一个Node.js应用程序,我希望它可以在我们的生产机器上运行。这似乎是一个很普遍的要求,但我找不到合适的解决方案。是否存在用于部署生产Node.js应用程序的既定解决方案? 该应用程序很简单(<100 LOC),但是需要非常高效,可靠并且可以连续运行数年而无需重新启动。它将在大型站点上运行,每秒有数十个连接。(该应用程序不用作网络服务器,它只有JSON API) 这是我考

  • 在java.library.path:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib64:/lib:/usr/lib上找不到基于APR的Apache Tomcat本机库,该库允许在生产环境中实现最佳性能 此外,错误是: tomcat已经开始运行了,但恐怕还会再次发生。服务器上最近没有更新或安装,原因是什么?此外,有什么可能的永久解决办法呢?

  • 在运行rails 5.2.2和ruby 2.6.1的家用服务器上,一切正常;但是在我的linode上,我拒绝了用户“部署”@“localhost”的访问(使用密码:是)在家用服务器的database.yml中,我使用大卫作为用户,即unix帐户。在linode上使用相同的database.yml,我已经部署为database.yml文件中的用户。部署是linode服务器的unix帐户。 我已经尝试

  • 我有一个独立的Kafka经纪人,我试图配置SASL。配置如下。我试图在经纪人身上设置SASL_PLAIN身份验证。 我的理解是,这与听众有关。名称服务器中的配置。属性,我不需要jaas文件。但我已经尝试过一种方法,看看这是否是一种更好的方法。 我对这些命令中的每一个都进行了实验,但都产生了相同的异常。 显示的异常为: KafkaServer启动期间出现致命错误。准备关机。。。找不到“KafkaSe