减少服务提供者的启动加速你服务的性能 2.0

性能一直是 Laravel 的最大话题之一,但它也确实为很多 PHP 开发者提供了很多不一样的知识,这里再次为框架加速一次.

基础 (老生常谈)#

  • 缓存,会话,队列都是用 Redis 驱动

  • 框架内置的缓存

    • 路由缓存 php artisan route:cache
    • 配置缓存 php artisan config:cache
  • 根据接口幂等性使用缓存

升级#

  • OPcache
    • 没什么特殊理由直接上这个
    • 并把 opcache.validate_timestamps 设置为 0, 让你生产环境的 PHP 代码永远不自动更新,类似于其它编译型语言,每次部署代码,需要重启 php-fpm 来加载新代码
    • 更多可参考这篇文章 gywbd.github.io/posts/2016/1/best-...

      减少不必要的中间件#

  • 比如 Laravel 现在已经内置了跨域中间件,如果只是为 APP 提供接口,完全就没有跨域的问题,可以直接注释这个中间件
  • 比如内置的 API 限制速率的接口,可能对很多项目场景就不合适

减少服务提供者#

  • 比如接口就不需要视图服务,Session 服务,密码重置服务等等

当然要讲的重点还是和 APIAdmin 混合的项目,使用了一个全栈的框架,相信也有很多项目使用了 Laravel-admin 或者是 Dcat Admin

之前我也写过一篇文章讲过如何减少你的服务提供者,因为自从 Laravel5.5 之后,需要第三方包都可以自己注册,然后 Laravel 自动发现这些服务提供者
可以运行这条命令找出你已经注册的服务提供者:

php artisan package:discover

Discovered Package: dcat/laravel-admin
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
  • 这里可以很明显看到了 dcat/laravel-admin, 我们只需要去项目根目录下的 composer.json 写入以下配置
 "extra": {
     "laravel": {
         "dont-discover": [
             "dcat/laravel-admin"
         ]
     }
 }
  • 当你这样子做了之后,再执行 php artisan package:discover 就会发现 dcat/laravel-admin 消失了
  • 不过这也代表我们无法使用 Admin 了,所以我们也需要增加一个条件来手动注册服务提供者
  • 我们可以在 AppServiceProvider.php 增加以下代码
<?php

namespace App\Providers;

use Dcat\Admin\Admin;
use Dcat\Admin\AdminServiceProvider;
use Illuminate\Foundation\AliasLoader;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // 这个条件有很多种方式, 你甚至可以通过 url 来判断
        if (config('admin.enable')) {
            AliasLoader::getInstance()->alias('Admin', Admin::class);
            $this->app->register(AdminServiceProvider::class);
        }
    }
}
  • 修改完毕之后,发现性能有了 40% 的提升 (因为 Admin 注册了很多路由,启动很多东西)
    机器:
    2U4G 的机器 CentOS Linux release 8.3.2011
    环境: (使用 Laradock 全家桶,开启 OPcache)
PHP_VERSION=7.4
PHP_FPM_INSTALL_OPCACHE=true
  • 最后找运维要了其中一台 API 服务器的图

减少服务提供者的启动加速你服务的性能 2.0

可以看到,优化之后的效果很好.

应该怎么注释视图服务#

  1. 打开 config/app.php 文件
  2. 注释视图服务 Illuminate\View\ViewServiceProvider::class
  3. 注释通知服务 (依赖视图)Illuminate\Notifications\NotificationServiceProvider::class
  4. 注释掉分页服务 (依赖视图)Illuminate\Pagination\PaginationServiceProvider::class
  5. 现在已经可以正常使用了,不过还有最后一步
  6. 找到文件 Exceptions\Handler.php
  7. 增加异常的 API 处理 (默认错误会返回一个视图,但我们有没有注册)
    public function render($request, Exception $exception)
    {
        if ($request->is('api*')) {
            return (
                new Response(json_encode([
                        'code' => 500,
                        'msg' => $exception->getMessage()]
                ))
            )
            ->withHeaders(['Content-Type' => 'application/json']);
        }

        return parent::render($request, $exception);
    }

Links#

www.shiguopeng.cn/archives/374
www.shiguopeng.cn/archives/507

本作品采用《CC 协议》,转载必须注明作者和本文链接
当神不再是我们的信仰,那么信仰自己吧,努力让自己变好,不辜负自己的信仰!
本帖由系统于 3年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 9

能不能举例,如何移除视图服务,我直接注释掉,报依赖错误,谢谢

3年前 评论

延迟提供者 # 如果你的服务提供者 只 在 服务容器 中注册,可以选择延迟加载该绑定直到注册绑定的服务真的需要时再加载,延迟加载这样的一个提供者将会提升应用的性能,因为它不会在每次请求时都从文件系统加载。

Laravel 编译并保存延迟服务提供者提供的所有服务的列表,以及其服务提供者类的名称。因此,只有当你在尝试解析其中一项服务时,Laravel 才会加载服务提供者。 要延迟加载提供者,需要实现 \Illuminate\Contracts\Support\DeferrableProvider 接口并置一个 provides 方法。这个 provides 方法返回该提供者注册的服务容器绑定:

3年前 评论

@mohy 之前移除了一些不是主要的服务,视图服务我尝试移除掉,但是有很好几个服务提供者依赖,我再看一下,如果能移除掉第一时间通知你.

@huangxu 我指的并不是这个,而是所有注册的服务提供者都会调用 register 和 boot 方法,你可以看一下其实很多是没用的,比如你的 API 和 admin 在同一个项目,你 1 台 admin, 10 台 API 服务器,这 10 台 API 就可以移除掉 admin 的 boot, 因为 adimn 会注册很多路由,加载很多东西.

文档指的是服务注册,是指你绑定了一个容器对象,当你实际调用 App::make() 才会调用闭包解析里面的对象.

3年前 评论

@mohy 已增加怎么注释掉视图服务的方法

3年前 评论

我新建了一个最新版本的 laravel 项目,注释视图之后报这个错误 :joy:

Target class [view.engine.resolver] does not exist.

3年前 评论

@Smile-_ 查看我写的这篇博客:
www.shiguopeng.cn/archives/512

Laravel

3年前 评论

试了一下报错了

Target class [admin.extend] does not exist.

3年前 评论

@臭鼬 按照教程的一步一步来了吗

3年前 评论
臭鼬 3年前
臭鼬 3年前

未填写
文章
42
粉丝
158
喜欢
713
收藏
347
排名:30
访问:22.2 万
私信
所有博文
社区赞助商