使用 swoole 加速 Lumen5.7 Restful API 接口

1.创建artisan命令,不了解可以参考我的上一篇文章使用 swoole 加速 Laravel5.6 Restful API 接口
2.新增/bootstrap/swoole.php文件作为框架的启动文件

    <?php
    require_once __DIR__.'/../vendor/autoload.php';
    try {
        (new Dotenv\Dotenv(dirname(__DIR__)))->load();
    } catch (Dotenv\Exception\InvalidPathException $e) {
        //
    }
    $app = new Laravel\Lumen\Application(
        dirname(__DIR__)
    );
    $app->singleton(
        Illuminate\Contracts\Debug\ExceptionHandler::class,
        App\Exceptions\Handler::class
    );
    $app->singleton(
        Illuminate\Contracts\Console\Kernel::class,
        App\Console\Kernel::class
    );

3.编写操作类SwooleServerHandle

    <?php
    /**
     * Created by PhpStorm.
     * User: kite
     */

    namespace App\Handles;

    class SwooleServerHandle
    {
        //header Server 全局变量的映射关系
        private static $headerServerMapping = [
            'x-real-ip'       => 'REMOTE_ADDR',
            'x-real-port'     => 'REMOTE_PORT',
            'server-protocol' => 'SERVER_PROTOCOL',
            'server-name'     => 'SERVER_NAME',
            'server-addr'     => 'SERVER_ADDR',
            'server-port'     => 'SERVER_PORT',
            'scheme'          => 'REQUEST_SCHEME',
        ];

        public function onWorkerStart($serv,$worker_id)
        {
            require_once __DIR__.'/../../bootstrap/swoole.php;
        }

        public function onRequest($request,$response)
        {
            //server信息
            $_SERVER =[];
            if (isset($request->server)) {
                foreach ($request->server as $k => $v) {
                    $_SERVER[strtoupper($k)] = $v;
                }
            }

            //header头信息
            if (isset($request->header)) {
                foreach ($request->header as $key => $value) {
                    if (isset(self::$headerServerMapping[$key])) {
                        $_SERVER[self::$headerServerMapping[$key]] = $value;
                    } else {
                        $key = str_replace('-', '_', $key);
                        $_SERVER[strtoupper('http_' . $key)] = $value;
                    }
                }
            }
            //是否开启https
            if (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] === 'https') {
                $_SERVER['HTTPS'] = 'on';
            }
            //request uri
            if (strpos($_SERVER['REQUEST_URI'], '?') === false && isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0
            ) {
                $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
            }

            //全局的
            if (!isset($_SERVER['argv'])) {
                $_SERVER['argv'] = isset($GLOBALS['argv']) ? $GLOBALS['argv'] : [];
                $_SERVER['argc'] = isset($GLOBALS['argc']) ? $GLOBALS['argc'] : 0;
            }

            //get信息
            $_GET = [];
            if (isset($request->get)) {
                foreach ($request->get as $k => $v) {
                    $_GET[$k] = $v;
                }
            }

            //post信息
            $_POST = [];
            if (isset($request->post)) {
                foreach ($request->post as $k => $v) {
                    $_POST[$k] = $v;
                }
            }

            //文件请求
            $_FILES =[];
            if (isset($request->files)) {
                foreach ($request->files as $k => $v) {
                    $_FILES[$k] = $v;
                }
            }
            //cookie
            $_COOKIE=[];
            if (isset($request->cookie)) {
                foreach ($request->cookie as $k => $v) {
                    $_COOKIE[$k] = $v;
                }
            }

            ob_start();//启用缓存区
            app()->router->group([
                'namespace' => 'App\Http\Controllers',
            ], function ($router) {
                require __DIR__.'/../../routes/web.php';
            });
            app()->run();
            $res = ob_get_contents();//获取缓存区的内容
            ob_end_clean();//清除缓存区
            //输出缓存区域的内容
            $response->end($res);
        }
    }

4.使用php artisan swoole start即可开启服务,在nginx配置代理.配置参考如下:

server {
    listen  80;
    server_name  lumen.vip;

    access_log  /var/log/nginx/lumen.access.log  main;
    error_log   /var/log/nginx/lumen.error.log   error;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        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;
        proxy_pass http://127.0.0.1:9502;
      }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
死磕,不要放弃,终将会有所收获。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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