原文:https://www.codecasts.com/blo...

在部署 Laravel 项目的时候,我们经常会使用到一个提升性能的命令:

php artisan optimize

本文来看看这个命令执行背后的源码:

首先我们可以使用编辑器搜 OptimizeCommand,应该就可以找到该命令源码的所在:
Illuminate\Foundation\Console\OptimizeCommand,我们关注其中的 fire() 方法:

 public function fire(){$this->info('Generating optimized class loader');if ($this->option('psr')) {$this->composer->dumpAutoloads();} else {$this->composer->dumpOptimized();}$this->call('clear-compiled');}

fire() 方法,默认情况下,会执行$this->composer->dumpOptimized(),而这行代码触发的其实就是composer dump-autoload --optimize,源代码可以在Illuminate\Support\ComposerdumpOptimized() 找到:

public function dumpOptimized(){$this->dumpAutoloads('--optimize');}

最后,optimize 命令还执行了call('clear-compiled'),其实就是触发php artisan clear-compiled,而很巧的是,我们也是可以直接使用编辑器搜ClearCompiledCommand 来找到源码,位于 Illuminate\Foundation\Console\ClearCompiledCommand 中,这里的 fire() 方法其实关键的一步就是删除了一下 cache 下的文件,我们来看:

public function fire(){$servicesPath = $this->laravel->getCachedServicesPath();if (file_exists($servicesPath)) {@unlink($servicesPath);}$this->info('The compiled services file has been removed.');}

通过确定 $servicesPath 的位置,再使用 @unlink($servicesPath); 删除。

确定 $servicesPath 的代码 $this->laravel->getCachedServicesPath() 位于 Illuminate\Foundation\ApplicationgetCachedServicesPath 中:

 public function getCachedServicesPath(){return $this->bootstrapPath().'/cache/services.php';}

这样一看,其实就是将 bootstrap/cache/services.php 文件删除,而这个 services.php 是 Laravel 会自动生成的一个数组文件,这里指定了每个 Providers 和 Facades 的位置和命名空间的全路径等,在启动 Laravel 项目的时候,可以直接读取使用。

所以这个命令可以拆为两步:

1.composer dump-autoload --optimize // composer 层面优化加载速度
2.php artisan clear-compiled // 删除 bootstrap/cache/services.php

很清晰。

Laravel php artisan optimize 源码解读相关推荐

  1. php artisan code,源码解读 Laravel PHP artisan config:cache

    再来一篇源码解读系列,其实包含本篇 config:cache 源码解读在内,这三篇的源码解读都是跟线上环境部署 Laravel 项目有关,因为我们通常会使用这三个 artisan 命令来提高项目的执行 ...

  2. php artisan实现机制,源码解读:php artisan serve

    在学习 Laravel 的时候,可能很多人接触的第一个 artisan 的命令就是:php artisan serve,这样我们就可以跑起第一个 Laravel 的应用.本文来尝试解读一下这个命令行的 ...

  3. PyTorch 源码解读之即时编译篇

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 作者丨OpenMMLab 来源丨https://zhuanlan.zhihu.com/ ...

  4. PostgreSQL 源码解读(160)- 查询#80(如何实现表达式解析)

    本节介绍了PostgreSQL如何解析查询语句中的表达式列并计算得出该列的值.表达式列是指除关系定义中的系统列/定义列之外的其他投影列.比如: testdb=# create table t_expr ...

  5. PostgreSQL 源码解读(32)- 查询语句#17(查询优化-表达式预处理#2)

    本节简单介绍了PG查询优化表达式预处理中常量的简化过程.表达式预处理主要的函数主要有preprocess_expression和preprocess_qual_conditions(调用preproc ...

  6. underscore-1.8.3.js 源码解读全文注释版

    // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud an ...

  7. 约2万字-Vue源码解读汇总篇(续更)

    约2万字-Vue源码解读汇总篇(续更) 一.前言 1.系列汇总 未完待续... Vue源码解读:06Vue3探索篇 Vue源码解读:05生命周期篇 Vue源码解读:04模板编译篇 Vue源码解读:03 ...

  8. Mask RCNN源码解读

    Mask RCNN源码解读 前言 数据集 数据载入 模型搭建 模型输入 模型输出 resnet101 RPN网络 ProposalLayer DetectionTargetLayer fpn_clas ...

  9. Vue源码解读(六):update和patch

    Vue 的 _update 是实例上的一个私有方法,主要的作用就是把 VNode 渲染成真实的 DOM ,它在首次渲染和数据更新的时候被调用.在数据更新的时候会发生新 VNode 和 旧 VNode ...

最新文章

  1. 社区发现算法 - Fast Unfolding(Louvian)算法初探
  2. 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )
  3. 前端学习(804):替换字符串和转换为数组
  4. 高精度测量让交会对接更“温柔”
  5. 继爱奇艺后,腾讯视频会员也要涨价了
  6. JSP环境搭建和入门
  7. Python数据结构与算法笔记(六):数据结构——列表和栈
  8. 2019年最新移动互联网全行业排行榜!
  9. 图灵专栏微信小程序上线
  10. DirectShow录屏,帧率不可控制?
  11. Eclipse安装包下载慢解决方法
  12. 思科计算机网络技术第一章,cisco思科网络技术教程第一章.ppt
  13. Target DLL has been cancelled
  14. Adjacent Bit Counts
  15. PHP解决某些特殊汉字符或汉字转码后成乱码或者空白的问题
  16. 基于BLE + LoRa人员定位技术下的室内定位-Lora人员定位-新导智能
  17. 25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器
  18. 提升色觉障碍用户的视频观看体验——播放器色觉辅助功能开发
  19. java计算机毕业设计网上扶贫农产品销售系统源代码+数据库+系统+lw文档
  20. Python基础——time模块(制作秒表、倒计时)

热门文章

  1. 设计模式:组合模式(Composite Pattern)
  2. spring二:装配bean(自动装配)
  3. Mybatis like模糊查询的写法
  4. 安卓自动化测试(1)安卓自动化测试原理概念
  5. 自建邮件服务器给企业带来的商业价值
  6. Android教程之实现动作感应技术
  7. python SQLAlchemy数据库操作
  8. 汇编语言 pushf 和 popf指令
  9. android 单选框 icon,Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解...
  10. Windows安装python 虚拟环境,Virtualenv