1.是什么限制Laravel框架的速度?

Laravel框架启动的时候需要加载很多文件,再加上其出了名的生态环境好,所以在开发过程中我们就会发现有非常多的已经造好的轮子,这也就使得Laravel的一次启动的磁盘IO特别高(就是要加载很多文件嘛),博主之前的一遍博客Laravel5框架性能优化技巧中也提到过一些优化,但是并没有实质的解决磁盘IO高的问题。

既然已经知道了问题所在,那就很容易解决了,只要每次启动Laravel的时候不都重新加载这些文件就好了,这时候大名鼎鼎的swoole就登场了。

2.Swoole

Swoole号称重新定义了PHP,它是一个PHP扩展,使得PHP可以使用异步的方式执行,就像node一样,而且还能使用socket,为PHP提供了一系列异步IO、事件驱动、并行数据结构功能。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。它可以大大提升项目的性能。

3.使用Swoole提升Laravel的性能

在现有的轮子中,感觉下面这两个还是非常不错的,可以自行选择

博主选择了第一个,不要问我为什么,任性!然后我们就开始吧!

使用composer安装:

composer require swooletw/laravel-swoole

如果你使用的是laravel,那么在 config/app.php 的 providers 数组中加上

SwooleTW\Http\LaravelServiceProvider::class,

如果你使用的是lumen,那么在 bootstrap/app.php 中加入如下代码

$app->register(SwooleTW\Http\LumenServiceProvider::class);

将配置文件导出到 config 目录下

 php artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"

然后可以去 config/swoole_http.php 中配置信息

'server' => [
'host' => env('SWOOLE_HTTP_HOST', '127.0.0.1'),
'port' => env('SWOOLE_HTTP_PORT', ''),
'options' => [
'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', ),
],
],

host和post不用多说,options里面的具体配置可以去swoole官网查看详细参数信息。

swoole_http.php 里还提供配置 providers 数组,

'providers' => [
// App\Providers\AuthServiceProvider::class,
]

因为使用swoole作为http后,这些providers会被存到内存中,所以这里配置的是每次请求都想要重新注册和重新启动的providers。

Artisan Commands

这个轮子完全使用artisan命令来操作。

php artisan swoole:http start|stop|restart|reload

依次是,启动/停止/重启/重载。

所以我们可以通过以下命令来启动swoole_http_server

php artisan swoole:http start

现在可以通过配置文件里的host和port去访问Laravel了,例如我的配置是: 127.0.0.1:

注意:该拓展是不支持热启动的,所以每次有代码更新都要重启服务 php artisan swoole:http restart 。当然你也可以在linux上写一个脚本,让 git pull 代码后自动重启服务。

4.性能测试

下面让我们来看两张图。

使用swoole前:

使用swoole后:

这里是使用Apache的ab测试工具

ab -n1000 -c10 http://127.0.0.1:1215

我们可以惊奇的发现, Request per second 从原来的20多,提升到了600多。将近提升了30倍左右。啊,多么痛的领悟!!

5.使用Nginx代理

swoole在官网也提到过:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。

那么,我们就增加需要配置nginx.conf里的server:

server {
listen ;
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;
} location / {
try_files $uri $uri/ @swoole;
} location @swoole {
set $suffix ""; if ($uri = /index.php) {
set $suffix "/";
} proxy_set_header Host $host;
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; # IF https
# proxy_set_header HTTPS "on"; proxy_pass http://127.0.0.1:1215$suffix;
}
}

至此,大功告成,你可以像平常一样访问你的网站了。

在Laravel中使用swoole来取代nginx作为http服务器的更多相关文章

  1. Laravel 中使用 swoole 项目实战开发案例二 (后端主动分场景给界面推送消息)

    推荐阅读:Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)​ 需求分析 我们假设有一个需求,我在后端点击按钮 1,首页弹出 “后端触发了按钮 1”.后端点了 ...

  2. Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)

    1 开发需要环境 工欲善其事,必先利其器.在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率. 安装 swoole 拓展包 安装 redis 拓展包 安装 la ...

  3. Nginx高性能web服务器详解书中概要

    一.Nginx功能 1.Nginx服务器以其功能丰富著称于世.它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器;能够快速响应静态页面(HTML)的请求;支持FastCGI.SSL.V ...

  4. Laravel中的日志与上传

    PHP中的框架众多,我自己就接触了好几个.大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了.也许有好多人吐槽TP,但是个人感觉不能说哪个框架好,哪个框架不好,再不好的框架你能把源码读上一遍,框架 ...

  5. laravel中日志为daily时如何设置最大保存天数

    在laravel中,日志设置为daily时,默认保存七天的日志,超过则清除七天前的日志.可修改默认的设置,假如要保存30天的日志,则配置如下: 在配置文件config/app.php中添加如下代码: ...

  6. laravel中的错误与日志

    日志 laravel中的日志是基于monolog而封装的.laravel在它上面做了几个事情: 把monolog中的addInfo等函数简化成为了info这样的函数 增加了useFiles和useDa ...

  7. laravel中的$request对象构造及请求生命周期

    laravel应用程序中index.php是所有请求的入口.当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据, 生成一个request对象 ...

  8. cron以及在laravel中使用cron

    yum install vixie-cron yum install crontabs /bin/systemctl restart crond.service #启动服务 /bin/systemct ...

  9. Laravel中的队列处理

    Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...

随机推荐

  1. SmartAdmin(SmartAdmin_v1.5.2)

    SmartAdmin_v1.5.2是一个基于bootstrap上开发的页面设置,前后台数据交互和样式显示. 用过的例子有F:\SmartAdmin_v1.5.2\SmartAdmin_v1.5.2\D ...

  2. 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  3. Android Debug Bridge

    Android Debug Bridge Introduction     Android Debug Bridge (adb) is a versatile command line tool th ...

  4. SHA1 安全哈希算法(Secure Hash Algorithm)

    安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signatu ...

  5. react 体验 react与vue的比较

    用了 vue 大半年了,不过我在2016年暑假的时候就看到了 react 这个项目,有点想学习一番,之前学习的都是基础语法和一些基础用法吧,总的来说 mvvm 框架确实都很相似,会一个就可以了; 今天 ...

  6. [最短路]P1339 [USACO09OCT]热浪Heat Wave

    题目描述 The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for g ...

  7. MySQL分类表设计--根据ID删除全部子类

    在做数据库分类表的时候,通常会有这样的设计:一个字段是ID,另一个字段PID,PID指向自己的上级分类: 这样的设计带来的问题是:我要删除一个类,我希望它的子类全部一起删除: 在不知道分类有多少层级的 ...

  8. HTML的iframe标签妙用 - 在线执行前端代码的网站原理是什么?

    在我自己的日常前端开发中,其实iframe标签出现的次数并不是很多.作为一个很古老(浏览器兼容性非常好)的标签,有必要去了解一下它的典型应用场景. (图片说明:所有浏览器都支持iframe,无论什么版 ...

  9. JavaScript OOP(一)之构造函数与new命令

    面向对象编程:Object Oriented Programming,简称OOP. 典型的oop语言,如hava.c++,存在着类的概念,类就是对象的模板 (类可以类比为人类:而实例化类后变为对象,对 ...

  10. 对jQuery源码的一点感悟

    1.  链式写法 这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次敲打对象变量的麻烦 2.  动态参数 偶尔使用Java的动 ...