减少服务提供者的启动加速你服务的性能 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服务,密码重置服务等等
当然要讲的重点还是和API和Admin混合的项目, 使用了一个全栈的框架,相信也有很多项目使用了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服务器的图

可以看到, 优化之后的效果很好.
应该怎么注释视图服务
- 打开
config/app.php文件 - 注释视图服务
Illuminate\View\ViewServiceProvider::class - 注释通知服务(依赖视图)
Illuminate\Notifications\NotificationServiceProvider::class - 注释掉分页服务(依赖视图)
Illuminate\Pagination\PaginationServiceProvider::class - 现在已经可以正常使用了, 不过还有最后一步
- 找到文件
Exceptions\Handler.php - 增加异常的
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 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
关于 LearnKu
感谢分享
能不能举例,如何移除视图服务,我直接注释掉,报依赖错误,谢谢
延迟提供者# 如果你的服务提供者 只 在 服务容器 中注册,可以选择延迟加载该绑定直到注册绑定的服务真的需要时再加载,延迟加载这样的一个提供者将会提升应用的性能,因为它不会在每次请求时都从文件系统加载。
Laravel 编译并保存延迟服务提供者提供的所有服务的列表,以及其服务提供者类的名称。因此,只有当你在尝试解析其中一项服务时,Laravel 才会加载服务提供者。 要延迟加载提供者,需要实现 \Illuminate\Contracts\Support\DeferrableProvider 接口并置一个 provides 方法。这个 provides 方法返回该提供者注册的服务容器绑定:
@mohy 之前移除了一些不是主要的服务, 视图服务我尝试移除掉, 但是有很好几个服务提供者依赖, 我再看一下, 如果能移除掉第一时间通知你.
@huangxu 我指的并不是这个, 而是所有注册的服务提供者都会调用 register 和 boot 方法, 你可以看一下其实很多是没用的, 比如你的 API 和 admin 在同一个项目, 你 1 台 admin, 10 台 API 服务器, 这 10 台 API 就可以移除掉 admin 的 boot, 因为 adimn 会注册很多路由, 加载很多东西.
文档指的是服务注册, 是指你绑定了一个容器对象, 当你实际调用
App::make()才会调用闭包解析里面的对象.@mohy 已增加怎么注释掉视图服务的方法
我新建了一个最新版本的laravel项目,注释视图之后报这个错误 :joy:
@Smile-_ 查看我写的这篇博客:
www.shiguopeng.cn/archives/512
试了一下报错了
Target class [admin.extend] does not exist.
@臭鼬 按照教程的一步一步来了吗