用swoole加速laravel
欢迎使用swoole来加速laravel
下图展示了PHP的生命周期,正如你所看到的那样,当你每次运行PHP脚本的时候,PHP都需要初始化模块并为你的运行环境启动Zend引擎,中间会经过语法分析、词法分析,最后把你的代码编译为OpCode来交给Zend引擎执行。
但是,这样的生命周期需要在每次请求的时候都执行一遍,因为单个请求创建的环境在请求执行结束之后会立即销毁。
换句话说,在传统的PHP生命周期中,为了脚本执行而浪费了大量的时间去创建和销毁资源。想象一下Laravel这样的框架,在每次请求中需要加载多少文件?同时也需要大量的I/O操作。这将花费大量的时间。
因此如果我们利用swoole内置一个应用级别的Server,并且所有的脚本文件在加载一次之后便可以保存在内存中,那性能会有很大的提升。Swoole可以提供强大性能而Laravel则可以提供优雅的代码结构,这俩真是完美组合。
安装
首先需要安装swoole扩展,具体可参考我的另一篇文章 链接
使用composer安装swooletw插件
composer require swooletw/laravel-swoole
然后添加服务提供者:
如果你使用的Laravel,在config/app.php 服务提供者数组中添加该服务提供者:
[
‘providers’ => [
SwooleTW\Http\LaravelServiceProvider::class,
],
]
如果你使用的Lumen,请将下面的代码加到bootstrap/app.php
$app->register(SwooleTW\Http\LumenServiceProvider::class);
将包中的配置文件发布到 app/config 中
//config下生成swoole_http.conf和swoole_websocket.php以及routes下websocket.php
php artisan vendor:publish --tag=laravel-swoole
启动
swoole直接对外服务
php artisan swoole:http start
然后可以看到以下信息:
Starting swoole http server…
Swoole http server started: http://127.0.0.1:1215
然后你可以通过 http://127.0.0.1:1215 来访问的你laravel应用。
使用nginx代理对外服务(推荐这种)
nginx配置
map $http_upgrade $connection_upgrade {
default upgrade;
‘’ close;
}
server {
listen 80;
server_name your.domain.com;
root /path/to/laravel/public;
index index.php;
location = /index.php {
# Ensure that there is no such file named "not_exists"
# in your "public" directory.
try_files /not_exists @swoole;
}
# any php files must not be accessed
#location ~* \.php$ {
# return 404;
#}
location / {
try_files $uri $uri/ @swoole;
}
location @swoole {
set $suffix "";
if ($uri = /index.php) {
set $suffix ?$query_string;
}
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# IF https
# proxy_set_header HTTPS "on";
proxy_pass http://127.0.0.1:1215$suffix;
}
配置完成后可直接通过域名访问。
最后说一下在使用中遇到的问题:
PHP中的超全局变量无法使用
$_POST
$_GET
$_SERVER
$_FILES
$_COOKIE
$_REQUEST
推荐通过 Illuminate\Http\Request 对象来获取请求信息
————————————————