首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >,Redis,Socket.IO:似乎无法让它们工作

,Redis,Socket.IO:似乎无法让它们工作
EN

Stack Overflow用户
提问于 2020-12-24 11:18:58
回答 2查看 7.4K关注 0票数 5

我正在和Laravel一起开发实时应用程序。由于我不想使用Pusher,所以我试图让websockets使用Laravel Echo服务器、Redis和Socket.IO,但是,这个堆栈有问题。客户端(浏览器)似乎无法从事件中接收数据。我还使用Intertia和Vue作为前端。还值得注意的是,我使用萨拉贡作为本地开发环境。

我的.env,有些被省略了:

代码语言:javascript
复制
APP_URL=http://malbe.test

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=redis
SESSION_DRIVER=file
SESSION_LIFETIME=120

MIX_APP_URL="${APP_URL}"

我的laravel-echo-server.json

代码语言:javascript
复制
{
    "authHost": "http://malbe.test",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "omitted",
            "key": "omitted"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "secureOptions": 67108864,
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "http://malbe.test:80",
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

我在database.php上的redis配置:注意:我使用predis,因为我似乎无法使phpredis工作,即使我在PHP扩展上安装了dll。

代码语言:javascript
复制
'redis' => [

        // 'client' => env('REDIS_CLIENT', 'phpredis'),
        'client' => env('REDIS_CLIENT', 'predis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            // 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
            'prefix' => "",
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],

    ],

我的大型活动:

代码语言:javascript
复制
class SampleEvent implements ShouldBroadcast {
   use Dispatchable, InteractsWithSockets, SerializesModels;

   public function __construct()
   {
       //
   }

   public function broadcastOn() {
      return new Channel("my-channel");
   }

   public function broadcastWith() {
      return ["data"=>"Hello"];
   }
}

我在bootstrap.js的回声初始化

代码语言:javascript
复制
import Echo from "laravel-echo";
window.io = require("socket.io-client");

if (typeof window.io !== "undefined") {
    window.Echo = new Echo({
        broadcaster: "socket.io",
        host: process.env.MIX_APP_URL + ":6001"
    });
}

在订阅Echo服务器的Vue页面上

代码语言:javascript
复制
export default {
    props: ["foo"],
    mounted: function () {
        window.Echo.channel("my-channel").listen("SampleEvent", (d) => console.log(d));
    }
};

在运行这3个命令时:

  1. laravel-echo-server start
  2. npm run watch
  3. php artisan queue:work

我试着用Tinker广播一个事件并得到请求。

代码语言:javascript
复制
Route::get("/broadcast", function () {
    event(new \App\Events\SampleEvent);
    // also tried
    // broadcast(new \App\Events\SampleEvent);
});

队列工作者处理事件;

代码语言:javascript
复制
[2020-12-24 11:07:35][n9FKq0n6C6QOKa2f1JBzWcCqgYqLiDvU] Processing: App\Events\SampleEvent
[2020-12-24 11:07:35][n9FKq0n6C6QOKa2f1JBzWcCqgYqLiDvU] Processed:  App\Events\SampleEvent

当一个事件被广播时,laravel-echo-server输出这个;

代码语言:javascript
复制
L A R A V E L  E C H O  S E R V E R  
                                     
version 1.6.2                        
                                     
⚠ Starting server in DEV mode...     
                                     
✔  Running at localhost on port 6001 
✔  Channels are ready.               
✔  Listening for http events...      
✔  Listening for redis events...     
                                     
Server ready!                        
                                 
Channel: my-channel                  
Event: App\Events\SampleEvent        

客户端不显示任何错误。下面是开发人员控制台上的Network:

浏览器网络选项卡

当我在客户机仍然打开时关闭laravel-echo-server时,这个错误每隔一秒发生一次:

拒不

抱歉,这个问题太长了,我只需要展示我所有的配置,这样我就可以帮你解决这个问题了。有人能帮我找到正确的解决方案吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-23 13:07:41

我认为你的配置代码是正确的。您可以在vue中看到package.json的配置:

代码语言:javascript
复制
"socket.io-client": "^2.4.0",

如果您的"socket.io-client">=3,最好将其转换为2.4.0。然后跑:

代码语言:javascript
复制
sudo cnpm i socket.io@2.4.0
票数 13
EN

Stack Overflow用户

发布于 2022-04-21 12:37:51

回声不支持也不计划支持Socket IO >= v3这里有更多信息:https://github.com/laravel/echo/issues/290

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65437604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档