Yii2 init 初始化脚本分析
脚本目的:
init 脚本主要的作用是:从 environments 目录中复制配置文件,确保应用适配不同环境(例如开发、生产环境等)。
工作流程:
-
获取
$_SERVER的argv参数 -
加载
environments/index.php文件,拿到不同环境配置指定的配置文件关系。 -
如果执行
init脚本时提供了--env选项,例如:--env=Development则直接应用此环境,否则会被提示需要选择一个环境来初始化。 -
获取
environments对应环境下的所有文件。 -
因为上一步获取到的所有文件是带有文件全路径的,所以这一步直接复制文件到对应的路径,如:
frontend/config/params-local.php。 -
从
environments/index.php文件中获取到对应环境所配置的需要设置可写、可执行的目录来执行操作。
代码详解:
- 解析命令行参数:

- 检查命令行参数:

- 获取
environments中的文件列表:

- 复制文件:
function copyFile($root, $source, $target, &$all, $params)
{// 检查源文件是否存在if (!is_file($root . '/' . $source)) {echo " skip $target ($source not exist)\n";return true;}// 检查目标文件是否存在if (is_file($root . '/' . $target)) {if (file_get_contents($root . '/' . $source) === file_get_contents($root . '/' . $target)) {echo " unchanged $target\n";return true;}// 如果$all为true,输出信息并直接进行覆盖。// 否则,提示用户目标文件已存在,并询问是否覆盖(选择“是”、“否”、“全部”或“退出”)。if ($all) {echo " overwrite $target\n";} else {echo " exist $target\n";echo " ...overwrite? [Yes|No|All|Quit] ";// 通过命令行接收用户输入。如果$params['overwrite']不为空,使用该值;否则,等待用户输入。$answer = !empty($params['overwrite']) ? $params['overwrite'] : trim(fgets(STDIN));// 根据用户输入执行相应操作:// 如果输入“q”或“Q”,返回false以退出操作。// 如果输入“y”或“Y”,输出覆盖信息并继续。// 如果输入“a”或“A”,输出覆盖信息并设置$all为true,以便后续文件均自动覆盖。// 其他输入则跳过目标文件。if (!strncasecmp($answer, 'q', 1)) {return false;} else {if (!strncasecmp($answer, 'y', 1)) {echo " overwrite $target\n";} else {if (!strncasecmp($answer, 'a', 1)) {echo " overwrite $target\n";$all = true;} else {echo " skip $target\n";return true;}}}}file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));return true;}// 如果目标文件不存在,输出信息并进行复制。echo " generate $target\n";// 使用@mkdir创建目标文件的目录(如果不存在),并设置目录权限为0777。@mkdir(dirname($root . '/' . $target), 0777, true);file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));return true;
}
- 执行回调方法:
$callbacks = ['setCookieValidationKey', 'setWritable', 'setExecutable', 'createSymlink'];
foreach ($callbacks as $callback) {if (!empty($env[$callback])) {$callback($root, $env[$callback]);}
}
// 读取 environments/index.php 文件的配置:
'Development' => ['path' => 'dev','setWritable' => [ // runtime目录设置为可写'backend/runtime','console/runtime','frontend/runtime',],'setExecutable' => [ // yii、yii_test文件设置为可执行'yii','yii_test',],'setCookieValidationKey' => ['backend/config/main-local.php','common/config/codeception-local.php','frontend/config/main-local.php',],
],// 执行具体的回调方法:
// 设置文件可写
function setWritable($root, $paths)
{foreach ($paths as $writable) {if (is_dir("$root/$writable")) {if (@chmod("$root/$writable", 0777)) {echo " chmod 0777 $writable\n";} else {printError("Operation chmod not permitted for directory $writable.");}} else {printError("Directory $writable does not exist.");}}
}// 设置文件可执行
function setExecutable($root, $paths)
{foreach ($paths as $executable) {if (file_exists("$root/$executable")) {if (@chmod("$root/$executable", 0755)) {echo " chmod 0755 $executable\n";} else {printError("Operation chmod not permitted for $executable.");}} else {printError("$executable does not exist.");}}
}function setCookieValidationKey($root, $paths)
{foreach ($paths as $file) {echo " generate cookie validation key in $file\n";$file = $root . '/' . $file;$length = 32;$bytes = openssl_random_pseudo_bytes($length);$key = strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.');$content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($file));file_put_contents($file, $content);}
}
相关文章:
Yii2 init 初始化脚本分析
脚本目的: init 脚本主要的作用是:从 environments 目录中复制配置文件,确保应用适配不同环境(例如开发、生产环境等)。 工作流程: 获取 $_SERVER 的 argv 参数 加载 environments/index.php 文件&#…...
深入理解gPTP时间同步过程
泛化精确时间协议(gPTP)是一个用于实现精确时间同步的协议,特别适用于分布式系统中需要高度协调的操作,比如汽车电子、工业自动化等。 gPTP通过同步主节点(Time Master)和从节点(Time Slave)的时钟,实现全局一致的时间参考。 以下是gPTP实现主从时间同步的详细过程:…...
基于阿里云服务的移动应用日志管理方案—日志的上传、下载、存档等
前言 如题,基于阿里云服务(ECS、OSS)实现 APP 的用户日志上传以及日志下载的功能,提高用户反馈问题到研发去分析、定位、解决问题的整个工作流的效率。 术语 ECS: 云服务器ECS(Elastic Compute Service)…...
Python浪漫之画星星
效果图(动态的哦!): 完整代码(上教程): import turtle import random import time # 导入time模块# 创建一个画布 screen turtle.Screen() screen.bgcolor("red")# 创建一个海龟&a…...
Android使用协程实现自定义Toast弹框
Android使用协程实现自定义Toast弹框 最近有个消息提示需要显示10s,刚开始使用协程写了一个shoowToast方法,传入消息内容、显示时间和toast显示类型即可,以为能满足需求,结果测试说只有5s,查看日志和源码发现Android系统中Toa…...
git diff命令详解
git diff 是 Git 中非常常用的命令,用于比较不同版本的文件改动。可以比较工作区、暂存区、或者提交之间的差异。下面是对 git diff 常用场景的详细解释: 1. git diff 当你执行 git diff 时,它会显示工作区与暂存区之间的差异,也…...
Vue 插槽:组件通信的“隐形通道”
在 Vue 中,插槽(slot)是实现组件内容分发的机制,允许我们将子组件的内容传递给父组件,从而提升组件的可复用性和灵活性。插槽的本质是通过将父组件内容传递到子组件指定的插槽位置,使得子组件在渲染时可以动…...
react1816中的setState同步还是异步的深层分析
setState 是 react 中更新 UI 的唯一方法,其内部实现原理如下: 调用 setState 函数时,React 将传入的参数对象加入到组件的更新队列中。React 会调度一次更新(reconciliation),在调度过程中,Re…...
【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第七篇-体积纹理绘制】
我们前几篇已经完成了渲染部分,现在终于开始做动态绘制功能了 之前使用的是这样一个体积雾的切片图,那么现在要做的就是动态编辑它 首先,让我们简单了解一下它是如何运作的: 开始绘制画布以渲染目标,并将材质绘制到画…...
Linux的环境搭建
目录 1、linux的简单介绍 2、搭建linux环境 2.1 linux的环境安装 2.2 使用Xshell远程登入linux 2.2.1 Xshell免密登入 2.3 windows与Xshell与linux云服务器的关系 1、linux的简单介绍 linux操作系统 为 部分汇编 C语言编写 的操作系统 源代码公开(开源),官…...
WPF+Mvvm案例实战(五)- 自定义雷达图实现
文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造:2、按钮添加:3、依赖注入 3、运行效果4、源代码获…...
网络爬虫-Python网络爬虫和C#网络爬虫
爬虫是一种从互联网抓取数据信息的自动化程序,通过 HTTP 协议向网站发送请求,获取网页内容,并通过分析网页内容来抓取和存储网页数据。爬虫可以在抓取过程中进行各种异常处理、错误重试等操作,确保爬取持续高效地运行 1、Python网…...
如何有效解除TikTok账号间的IP关联
在当今社交媒体环境中,TikTok凭借其独特的短视频形式吸引了数以亿计的用户。对许多内容创作者而言,运营多个账号是获取更大曝光和丰富内容的有效策略。然而,如何避免这些账号之间的IP关联,以防止被平台识别并封禁,成为…...
Python自省机制
Python 自省机制 Python 自省(Introspection)是一种动态检查对象的能力,使得开发者可以在运行时获取对象的相关信息,比如属性、方法、类型等。自省机制让 Python 具备了更强的动态性和灵活性,便于调试和开发。 自省&…...
wgan-gp 对连续变量 训练,6万条数据,训练结果不错,但是到局部的时候,拟合不好,是否可以对局部数据也进行计算呢
Wasserstein GAN with Gradient Penalty (WGAN-GP) 是一种改进的生成对抗网络(GAN),它通过引入梯度惩罚来改进训练过程,从而提高生成模型的稳定性和质量。如果你在使用WGAN-GP对连续变量进行训练时,发现整体训练结果不…...
python 制作 发货单 (生成 html, pdf)
起因, 目的: 某个小店,想做个发货单。 过程: 先写一个 html 模板。准备数据, 一般是从数据库读取,也可以是 json 格式,或是 python 字典。总之,是数据内容。使用 jinja2 来渲染模板。最终的结果可以是 h…...
GeoWebCache1.26调用ArcGIS切片
常用网址: GeoServer GeoWebCache (osgeo.org) GeoServer 用户手册 — GeoServer 2.20.x 用户手册 一、版本需要适配:Geoserver与GeoWebCache、jdk等的版本适配对照 查看来源 二、准备工作 1、数据:Arcgis标准的切片,通过…...
深度学习-卷积神经网络-基于VGG16模型, 实现猫狗二分类(文末附带数据集下载链接, 长期有效)
简介: 1.基于VGG16模型进行特征提取, 结合mlp实现猫狗二分类 2.训练数据--"dog_cat_class\training_set" 3.模型训练流程 1.对图像数据进行导入和预处理 2.搭建模型, 导入VGG16模型, 去除mlp层, 将经过VGG16训练后的数据作为输入, 输入到自建的mlp层中进行训练, 要…...
计算Java集合占用的空间【详解】
以ArrayList为例,假设集合元素类型是Person类型,假设集合容量为10,目前有两个person对象{name:“Jack”,age12} {name:“Tom”,age14} public class Person{private String name;private int age; }估算Person对象占用的大小: 对…...
仕考网:关于中级经济师考试的介绍
中级经济师考试是一种职称考试,每年举办一次,报名时间在7-8月,考试时间在10-11月 报名入口:中guo人事考试网 报名条件: 1.高中毕业并取得初级经济专业技术资格,从事相关专业工作满10年; 2.具备大学专科…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
