如果不能正常显示,请查看原文 , 或返回

swoole make laravel faster: full asynchronous non-blocking and skip bootstrapping on every request

swoole is a php extension which is a Asynchronous and concurrent and distributed networking framework for PHP

Its could replace nodejs fully because its full asynchronous non-blocking feature.

STEP 1:

pecl install swoole and add it to php.ini

STEP 2:

make file swoole-server.php in project base dir

make(Illuminate\Contracts\Http\Kernel::class);
            // $http = new swoole_http_server("127.0.0.1", 9501); // only listen to localhost
            $http = new swoole_http_server("0.0.0.0", 9501);
            $http->on('request', function ($request, $response) use($kernel) {
                
                // code from Illuminate\Http\Request::capture
                $l_request= new Symfony\Component\HttpFoundation\Request(
                    isset($request->get)?$request->get:[], isset($request->post)? $request->post:[], [], 
                    isset($request->cookie)?$request->cookie:[], isset($request->files)? $request->files:[], $request->server);
                
                if (0 === strpos($l_request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
                    && in_array(strtoupper($l_request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
                    ) {
                    parse_str($l_request->getContent(), $data);
                    $l_request->request = new  Symfony\Component\HttpFoundation\ParameterBag($data);
                }
                Illuminate\Http\Request::enableHttpMethodParameterOverride();
                $l_request=Illuminate\Http\Request::createFromBase( $l_request);
             

                $l_response = $kernel->handle( $l_request );

                ob_start();
                 
                $l_response->send();
                $kernel->terminate($l_request, $l_response);
                
                $result = ob_get_clean();
                $response->end($result);
            });
            $http->start();
        }
        
        
        public static function getInstance() {
            if (!self::$instance) {
                self::$instance = new HttpServer;
            }
            return self::$instance;
        }
        
    }
    HttpServer::getInstance();

STEP3:

php swoole-server.php and then visit 127.0.0.1:9501

STEP4:

swoole server does not implement all http features , so we can use nginx as proxy server, add this to a nginx site config

    location / {
        if (!-e $request_filename) {
             proxy_pass http://127.0.0.1:9501;
             proxy_http_version 1.1;
             proxy_set_header Connection "keep-alive";
        }
    }

swoole is used by many large firms in China , swoole server has far more QPS than php-fpm, nodejs server, golang server.

返回