V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nonfu
V2EX  ›  PHP

关于 Laravel 应用性能优化的几点建议

  •  
  •   nonfu · 2020-10-11 00:02:59 +08:00 · 3665 次点击
    这是一个创建于 1265 天前的主题,其中的信息可能已经有所发展或是发生改变。

    具体优化方案请阅读这篇文章:https://xueyuanjun.com/post/22069

    仅仅是对 Laravel 应用性能优化的一家之言而已,如果你有更好的建议,欢迎一起交流。

    请不要在评论区引入框架语言之争,很烦这个,有一条删一条,谢谢。

    11 条回复    2020-10-24 23:27:09 +08:00
    ywisax
        1
    ywisax  
       2020-10-11 00:35:02 +08:00
    看终端的样式,应该是本地压远程。。。这样得来的压测结果都是错的。
    nonfu
        2
    nonfu  
    OP
       2020-10-11 01:10:08 +08:00
    @ywisax 远程测试结果也是一样的
    nonfu
        3
    nonfu  
    OP
       2020-10-11 01:19:28 +08:00
    @ywisax 因为不存在带宽的问题 本身远程带宽很小
    nonfu
        4
    nonfu  
    OP
       2020-10-11 01:44:17 +08:00
    @ywisax 至于百度确实存在这个问题 这种集群部署的服务最好在其内网某台机器测试 所以仅做同等压测条件下的一个参考 同等条件的同行网站也不便拿来参考 有诋毁嫌疑 感谢您的指正
    dvaknheo
        5
    dvaknheo  
       2020-10-11 14:22:18 +08:00   ❤️ 1
    使用 CDN 访问静态资源(图片、JS 、CSS 文件)减轻带宽负载;
    // 这个是 web 后端通用的优化。
    服务器启用 PHP OPcache 扩展缓存 PHP 字节码;
    // 还好,没碰见过 OPcache 的 bug 。

    对于所有高频业务 SQL 查询,合理优化索引字段,提升数据库查询性能;

    // [ 这项很重要。ORM 导致 SQL 不直观,所以懂 ORM 不懂 SQL 不行,你需要在写 ORM 的时候大致估摸着会生成什么 sql 。 我还见过后期加东西因为之前写的太复杂看不懂,直接在最前面加 where 的, 管他什么索引性能,完成产品策划的任务就行]

    合理使用缓存,减少与 MySQL 服务器的交互,降低磁盘 IO ( Laravel 本身支持多种缓存驱动,可以非常方便地集成不同缓存系统,我这里使用的是 Redis 作为缓存驱动);

    // 最懒惰的是 select * 对应的 cache 啦。不会出现同步问题。

    PHP 本身不支持并发编程,但是可以引入队列系统异步处理耗时任务,比如邮件发送、涉及数据库操作的数据统计和更新、事件监听和处理等,通过多个队列进程实现并发处理效果( Laravel 本身支持多种队列驱动,可以非常方便地集成不同队列系统,并且提供了 Horizon 这一队列系统解决方案,我这里使用的是 Horizon + Redis + Supervisor 搭建小型队列系统);

    // 对于小系统来说,用数据库队列安全可靠没必要折腾那么多。

    通过 composer install --optimize-autoloader --no-dev 初始化项目依赖,以便加速 Composer 定位指定类对应的加载文件,同时不安装开发环境使用的依赖。

    // 发布要用 mv -T 来做版本发布,方便回滚。发布的时候当然不是 每次都 composer install 啦,网络出问题怎么办。如果 composer.json 没变化,直接 copy vendor 目录就是。
    发布脚本连带部署脚本一起跑
    wh1012023498
        6
    wh1012023498  
       2020-10-12 00:40:18 +08:00
    = = 这是做 seo 吗?文章很水。
    nonfu
        7
    nonfu  
    OP
       2020-10-12 10:48:13 +08:00
    @dvaknheo 是的 composer install 当然只是首次发布的时候用到 每个团队可能发布的方式不一样 把这个命令带入自己的发布流程即可 后续如果扩展包有变更 使用 update 即可 如果没有变更也不需要执行增加额外耗时 如果使用了版本发布 在预发环境这些工作其实都已经完成了 项目代码已经都打包好了
    ben1024
        8
    ben1024  
       2020-10-12 18:23:12 +08:00
    还有少用 session,最不济用 redis 做 session 的存储
    newtype0092
        9
    newtype0092  
       2020-10-21 17:00:41 +08:00
    @nonfu 我在 docker 里启动了一个 8.10 版本的空项目,不修改任何配置的情况下打开默认主页要 1 秒多点,我看了下执行时间主要是 Http Kernel 里的 bootstrap 执行了差不多 1 秒。
    请问下在不进行任何优化配置的情况下这个时间是正常的么?
    nonfu
        10
    nonfu  
    OP
       2020-10-24 08:39:42 +08:00
    @newtype0092 不正常,同样是 docker,同样是空项目,同样是 laravel 8,为啥我这里只要 55 ms

    ![]( https://qcdn.xueyuanjun.com/storage/uploads/images/gallery/2020-10/16034998629264.jpg)

    前提:php 7.4 + xdebug 关闭 + opcache 开启。除此之外没有其他任何优化。
    newtype0092
        11
    newtype0092  
       2020-10-24 23:27:09 +08:00
    @nonfu 谢谢,从网上查了下发现问题了,框架启动的时候从磁盘读了大量文件,我为了修改方便把 php 目录映射到宿主机了,这种映射的方式从 docker 里读取非常慢,我把目录挪到 docker 内部的目录速度就正常了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5341 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:09 · PVG 16:09 · LAX 01:09 · JFK 04:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.