写了一个 Composer 包来,支持 Laravel 的事件广播

之前当需要服务器主动推动消息到客户端的时候,一般用laravel的事件广播。然后用pusher的服务,或者用node写一个socket服务器。后来发现swoole这个好东西。就基于swoole写了一个laravel的包,可以通过laravle的artisan方便的调用。

这是地址:https://github.com/zhaohehe/laravel-echo-s...

很简陋,但是使用起来也很简单,?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 18

你要是绑定了微信我就打赏。

7年前 评论

@zhaohehe 第一次握手的时候可以成功,第二次就直接报错了,郁闷,有没完整的demo.

7年前 评论

@白纸 前端是按照readme写的吗?

7年前 评论

@白纸 ? 报的错是什么呢

7年前 评论

报错如下:

PHP Fatal error:  Uncaught RedisException: read error on connection in /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/EchoMessage.php:42
Stack trace:
#0 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/EchoMessage.php(42): Redis->subscribe(Array, Object(Closure))
#1 [internal function]: EchoServer\EchoMessage->message(Object(swoole_websocket_server), Object(swoole_websocket_frame))
#2 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/SocketServer.php(43): swoole_http_server->start()
#3 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Server.php(27): EchoServer\SocketServer->start()
#4 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Commands/EchoCommand.php(58): EchoServer\Server->__construct()
#5 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Commands/EchoCommand.php(50): EchoServer\Commands\EchoCommand->start()
#6 [internal function]: EchoServer\Commands\EchoCommand->handle()
#7 /Users/wison/www/new_admin/vendor/lar in /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/EchoMessage.php on line 42
PHP Stack trace:
PHP   1. {main}() /Users/wison/www/new_admin/artisan:0
PHP   2. Illuminate\Foundation\Console\Kernel->handle() /Users/wison/www/new_admin/artisan:35
PHP   3. Symfony\Component\Console\Application->run() /Users/wison/www/new_admin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:121
PHP   4. Symfony\Component\Console\Application->doRun() /Users/wison/www/new_admin/vendor/symfony/console/Application.php:116
PHP   5. Symfony\Component\Console\Application->doRunCommand() /Users/wison/www/new_admin/vendor/symfony/console/Application.php:185
PHP   6. Illuminate\Console\Command->run() /Users/wison/www/new_admin/vendor/symfony/console/Application.php:817
PHP   7. Symfony\Component\Console\Command\Command->run() /Users/wison/www/new_admin/vendor/laravel/framework/src/Illuminate/Console/Command.php:155
PHP   8. Illuminate\Console\Command->execute() /Users/wison/www/new_admin/vendor/symfony/console/Command/Command.php:261
PHP   9. Illuminate\Container\Container->call() /Users/wison/www/new_admin/vendor/laravel/framework/src/Illuminate/Console/Command.php:169
PHP  10. call_user_func_array:{/Users/wison/www/new_admin/vendor/laravel/framework/src/Illuminate/Container/Container.php:508}() /Users/wison/www/new_admin/vendor/laravel/framework/src/Illuminate/Container/Container.php:508
PHP  11. EchoServer\Commands\EchoCommand->handle() /Users/wison/www/new_admin/vendor/laravel/framework/src/Illuminate/Container/Container.php:508
PHP  12. EchoServer\Commands\EchoCommand->start() /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Commands/EchoCommand.php:50
PHP  13. EchoServer\Server->__construct() /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Commands/EchoCommand.php:58
PHP  14. EchoServer\SocketServer->start() /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Server.php:27
PHP  15. swoole_http_server->start() /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/SocketServer.php:43

  [Symfony\Component\Debug\Exception\FatalErrorException]
  Uncaught RedisException: read error on connection in /Users/wison/www/new_a
  dmin/vendor/zhaohehe/laravel-echo-server/src/EchoMessage.php:42
  Stack trace:
  #0 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/EchoM
  essage.php(42): Redis->subscribe(Array, Object(Closure))
  #1 [internal function]: EchoServer\EchoMessage->message(Object(swoole_webso
  cket_server), Object(swoole_websocket_frame))
  #2 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Socke
  tServer.php(43): swoole_http_server->start()
  #3 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Serve
  r.php(27): EchoServer\SocketServer->start()
  #4 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Comma
  nds/EchoCommand.php(58): EchoServer\Server->__construct()
  #5 /Users/wison/www/new_admin/vendor/zhaohehe/laravel-echo-server/src/Comma
  nds/EchoCommand.php(50): EchoServer\Commands\EchoCommand->start()
  #6 [internal function]: EchoServer\Commands\EchoCommand->handle()
  #7 /Users/wison/www/new_admin/vendor/lar
7年前 评论

@白纸 应该是和redis相关的,你有开启redis服务吗,或者php有装redis扩展吗,redis的端口和密码对吗,应该就是这些问题了。

7年前 评论

@zhaohehe redis都开了啊,我玩队列都没问题

7年前 评论

@白纸 需要给php安装redis扩展,laravel的队列貌似是用predis的,你看一下有没有redis扩展

7年前 评论

@zhaohehe 有啊,php-m都看到了

7年前 评论

@白纸 有点难啊 你把EchoMessage.php的代码发给我看一下呢

7年前 评论

@zhaohehe

<?php
/*
 * Sometime too hot the eye of heaven shines
 */

namespace EchoServer;

use EchoServer\RedisOperation;

class EchoMessage
{
    private $request;

    private $redis;

    public function __construct()
    {
        $this->request = new Request();

        $redisOperate = new RedisOperation();
        $this->redis = $redisOperate->getRedis();

    }

    public function message($socketServer, $frame)
    {
        $fd = $frame->fd;
        $this->request->parse($frame->data);

        $event   = $this->request->getEvent();
        $channel = $this->request->getChannel();

        $this->redis->subscribe([$channel], function ($instance, $channelName, $message) use ($socketServer, $fd, $event, $channel) {

            $message = json_decode($message);
            $eventName = $message->event;

            if ($eventName == $event && $channelName == $channel) {
                $socketServer->push($fd, json_encode($message->data));
            }

        });

    }
}
7年前 评论

@白纸 修改一下config/database.php

  'redis' => [

        'cluster' => false,

        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
            'read_write_timeout' => -1,
        ],

    ],

增加一个read_write_timeout 参数 呢?

7年前 评论

@zhaohehe 还是一样的错误

7年前 评论

或者你来一个demo,然后我这边来试试,看看是我配置的问题还是插件的问题

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!