提高Laravel应用性能方法详解


Posted in PHP onJune 24, 2019

使用Laravel做开发是高效而愉悦的体验。
通常,当你准备部署应用的时候,你可能会意识到应用也许会在真实环境下表现不佳。

需要明白的是,没有银弹。通过努力去对应用的每个细节完成所有的优化,速度可能会变慢,但使用下面这些技巧会让你感到恰到好处。

缓存配置文件

laravel 的配置项分布在数十个配置文件中,在每次的请求中都将每个文件 including 进来很消耗性能。为了将所有的配置文件都合并为一个,可以使用:

php artisan config:cache

记住修改了配置文件后不会影响已有的配置文件缓存。为了刷新缓存,可以再次上述的命令。如果你想完全清除缓存,执行:

php artisan config:clear

路由缓存

在laravel中,路由也需要昂贵的开销。用以下命令缓存 routes.php 文件:

php artisan route:cache

请注意,它不适用于闭包。 如果你正在使用闭包,这是一个很好的机会将它们移动到控制器中,因为 artisan 命令在尝试编译绑定到闭包的路径而不是正确的控制器方法时会抛出异常。
与配置缓存相同,对 routes.php 的任何更改都不会有任何影响。 要刷新缓存,请在每次更改路径文件时运行上面的命令。 要完全清理干净路由缓存,请运行以下命令:

php artisan route:clear

类映射加载优化

在一个中型项目中,存在数百个 PHP 源文件是很正常的事情,由于良好的编程习惯,我们会把代码做一些分离,每一个 php 文件都有自己的职责。当然,这并非没有缺点,Laravel 必须为每一次请求都加载这数百个文件,这是一件很消耗性能的事情。

因此,一个比较好的办法是声明哪些文件是用户每一次请求(如:服务提供者,中间件等)都需要载入的 ,然后将这些需要每次加载的文件写入同一个文件中,减少 include 文件的数量。

这类似于 javascript 将文件合并为一个没有区别 (webpack, gulp),会减少游览器会服务器的请求。

如果需要添加其他的源文件,可以在 config / compile.php 的files key中声明。

当你把需要为每个请求都加载的文件设置好之后,它们就会写入同一个文件中,减少加载文件的性能消耗

php artisan optimize --force

优化 composer 的自动加载

这不仅适用于 laravel,而且适用于任何使用 composer 的应用程序。

我将首先解释 PSR-4 自动加载器的工作原理,然后向您展示应该运行什么命令来优化它。如果您对了解 composer 如何工作不感兴趣,我建议您直接跳到关于控制台命令的段落处。

当您向 compsoser 请求 App\Controllers\AuthController 类时,它首先在类映射中搜索直接关联。classmap 是一个由类和文件组成的 1 到 1 关联的数组。当然,由于您没有手动将 Login 类及其相关文件添加到类映射中,composer 将继续在命名空间中搜索。

因为 App 是一个 PSR-4 命名空间,默认情况下是与 Laravel 一起提供的,并且与 app/ 文件夹相关联,所以 composer 将尝试使用基本的字符串操作过程将 PSR-4 类名转换为文件名。最后,它猜测 App\Controllers\AuthController 必须位于 AuthController.php 文件中,它位于 Controllers/ 文件夹中,恰巧的是,该文件夹正好位于名称空间文件夹中,即 app/。

所有这些艰苦的工作只是为了得到 App\Controllers\AuthController 类存在于 app/Controllers/AuthController.php 文件中。为了让 composer 扫描整个应用程序并创建类和文件的直接 1 对 1 关联,运行以下命令:

composer dumpautoload -o

请记住,如果您已经运行了 php artisan optimize --force,那么您就不必再运行这个函数了。因为优化命令已经告诉 composer 创建一个优化的自动加载器。

JIT 编译器(即时编译器)

PHP 并不是天然就被计算机理解的。你不能把它编译为字节码然后让计算机运行。PHP 必须要经过一个中介,像是 Zend 引擎,它会解释 PHP 文件并执行相应的 C 例程。如你所想,它的速度很慢。每次你的服务器执行一个 PHP 文件,都必须把它转换成 tokens —— 这个过程由 AST 解析器完成并解释。不幸的是,解析器必须每次都编译 PHP 文件,即使它每次都得到相同的结果。

为了让你的应用速度更快,你需要一个 编译一次,终生运行 的方法,而这就是一个 JIT 编译器所做的事情。

对于 Laravel 所推荐使用的 JIT 编译器是 HHVM,由 Facebook 创立并广泛使用。Wikipedia、Etsy 和其他上千项目也在使用它。

使用更快的缓存和会话驱动

将 session 保存在文件中是种足够快速而又优雅的方法,自 PHP 开始的时代就在这样做了。但是如果你追求性能,那么文件系统就是你需要注意的一件事,因为它很慢。一种更好的做法是将 cache 和 session 存储在内存中,因为它提供了一种高效读写数据的方式。幸运的是,laravel 支持一些基于内存的 cache 和 session 驱动。

我的建议是使用 memcached 作为 cache 和 session 的驱动,但你可以选择任何你喜欢的,只要它是基于内存工作的。

要更改 session 驱动,需要检查以下文件中「driver」项:

app/config/session.php

要更改 cache 驱动,需要检查以下文件中「driver」项:

app/config/cache.php

不要低估通过优化查询语句带来的查询速度的提升
就像你看到的,大部分优化都是在不同的层面使用缓存。但当面临数据库优化时,你不应该依赖缓存。缓存应是优化查询的最后手段。

缓存查询结果

MySQL 不会替你做这件事,也不如你自己做的好。当然了你肯定不会把应用中每个查询的结果都做缓存,看看数据统计,在应用程序中那些高频率的查询语句,它们真的有必要被频繁地执行?每 15 分钟运行一次然后把相同的结果提供给用户不是更好吗?

在查询构造器中移除了 removing方法是件好事(它曾经是个很好的功能,但不够好 - 人们似乎高估了它的作用)。然后你可以更多地使用 Cache::remember 方法,就像这样:

$posts = Cache::remember('index.posts', 30, function()

{

return Post::with('comments', 'tags', 'author', 'seo')->whereHidden(0)->get();

});
PHP 相关文章推荐
NT IIS下用ODBC连接数据库
Oct 09 PHP
php连接mysql数据库代码
Mar 10 PHP
最新的php 文件上传模型,支持多文件上传
Aug 13 PHP
PHP函数常用用法小结
Feb 08 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
PHP中怎样防止SQL注入分析
Oct 23 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
PHP7 echo和print语句实例用法
Feb 15 PHP
PHP 出现 http500 错误的解决方法
Mar 09 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 #PHP
PHP中的self关键字详解
Jun 23 #PHP
php面向对象程序设计入门教程
Jun 22 #PHP
PHP字符串中抽取子串操作实例分析
Jun 22 #PHP
微信公众号之主动给用户发送消息功能
Jun 22 #PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 #PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 #PHP
You might like
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
Perl Substr()函数及函数的应用
2015/12/16 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
js实现蒙版效果
2020/01/11 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
python中Lambda表达式详解
2019/11/20 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
毕业生的自我评价
2013/12/30 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
电影红河谷观后感
2015/06/11 职场文书
Python基础知识之变量的详解
2021/04/14 Python