`Laravel`版`小丑路人社区`改版中,与`Hyperf版小丑路人社区`数据互动,此版本改版中……尚未彻底完结!

Q:

LaravelS - 基于Swoole加速Laravel

1.安装laravel-s的composer扩展包

composer require "hhxsv5/laravel-s:~3.7.0"

2.注册 Service Provider(以下两步二选一)

  • Laravel: 修改文件 config/app.php,Laravel5.5+支持包自动发现,你应该跳过这步

    providers' => [
          //...
          Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,
    ],
  • Lumen: 修改文件 bootstrap/app.php

    $app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);

3. 发布配置和二进制文件

每次升级 LaravelS 后,需重新 publish;点击 Release 去了解各个版本的变更记录。
php artisan laravels publish
# 配置文件:config/laravels.php
# 二进制文件:bin/laravels bin/fswatch bin/inotify

4. 修改配置 config/laravels.php:监听的 IP、端口等,请参考配置项

5.通过 Supervisord 监管主进程部署

前提是不能加 -d 选项并且设置 swoole.daemonize 为 false。
[program:laravel-s-test]
directory=/项目根目录
command=php bin/laravels start -i
numprocs=1
autostart=true
autorestart=true
startretries=3
user=www
redirect_stderr=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log

6.配置nginx

upstream swoole {
    # 通过 IP:Port 连接
    server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
    # 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能
    #server unix:/yourpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s;
    #server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s;
    #server 192.168.1.2:5200 backup;
    keepalive 16;
}
server {
    listen 80;
    # 别忘了绑Host
    server_name laravels.com;
    root /yourpath/laravel-s-test/public;
    access_log /yourpath/log/nginx/$server_name.access.log  main;
    autoindex off;
    index index.html index.htm;
    # Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。
    location / {
        try_files $uri @laravels;
    }
    # 当请求PHP文件时直接响应404,防止暴露public/*.php
    #location ~* \.php$ {
    #    return 404;
    #}
    location @laravels {
        # proxy_connect_timeout 60s;
        # proxy_send_timeout 60s;
        # proxy_read_timeout 120s;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header Server-Protocol $server_protocol;
        proxy_set_header Server-Name $server_name;
        proxy_set_header Server-Addr $server_addr;
        proxy_set_header Server-Port $server_port;
        # “swoole”是指upstream
        proxy_pass http://swoole;
    }
}

7.启用 WebSocket 服务器

WebSocket 服务器监听的 IP 和端口与 Http 服务器相同。
  • 1.创建 WebSocket Handler 类,并实现接口 WebSocketHandlerInterface。start 时会自动实例化,不需要手动创建实例
    namespace App\Services;
    use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;
    use Swoole\Http\Request;
    use Swoole\Http\Response;
    use Swoole\WebSocket\Frame;
    use Swoole\WebSocket\Server;
    /**
     * @see https://wiki.swoole.com/#/start/start_ws_server
     */
    class WebSocketService implements WebSocketHandlerInterface
    {
        // 声明没有参数的构造函数
        public function __construct()
        {
        }
        // public function onHandShake(Request $request, Response $response)
        // {
               // 自定义握手:https://wiki.swoole.com/#/websocket_server?id=onhandshake
               // 成功握手之后会自动触发onOpen事件
        // }
        public function onOpen(Server $server, Request $request)
        {
            // 在触发onOpen事件之前,建立WebSocket的HTTP请求已经经过了Laravel的路由,
            // 所以Laravel的Request、Auth等信息是可读的,Session是可读写的,但仅限在onOpen事件中。
            // \Log::info('New WebSocket connection', [$request->fd, request()->all(), session()->getId(), session('xxx'), session(['yyy' => time()])]);
            // 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch
            $server->push($request->fd, 'Welcome to LaravelS');
        }
        public function onMessage(Server $server, Frame $frame)
        {
            // \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]);
            // 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch
            $server->push($frame->fd, date('Y-m-d H:i:s'));
        }
        public function onClose(Server $server, $fd, $reactorId)
        {
            // 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch
        }
    }
  • 2.更改配置 config/laravels.php
    // ...
    'websocket'      => [
        'enable'  => true, // 注意:设置enable为true
        'handler' => \App\Services\WebSocketService::class,
    ],
    'swoole'         => [
        //...
        // dispatch_mode只能设置为2、4、5,https://wiki.swoole.com/#/server/setting?id=dispatch_mode
        'dispatch_mode' => 2,
        //...
    ],
    // ...

参考网址

https://learnku.com/articles/8050/laravels-accelerate-laravellumen-based-on-swoole-take-you-fly
Laravel
订阅

评论记录


评论/回复