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

Laravel框架
371
0
0
2022-04-18

性能一直是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