yii2 配置加速 – N个配置文件生成一个配置文件 [ 2.0 版本 ]
原文链接: yii2-配置加速-n个配置文件生成一个配置文件
yii2的配置方式是N个配置文件,最终通过merge函数合并成一个php数组,如果只有几个配置文件,
不会占用太多资源,如果像fecshop这类电商系统,有大量的配置文件,因此需要合并N个配置文件成一个配置文件,具体实现如下:
首先新建文件@app/merge_config.php 设置可写权限, 然后新建文件 @app/web/index-merge-config.php,
将index.php的内容复制过来,在 代码:$config = yii\helpers\ArrayHelper::merge
函数后面,
添加下面的代码,这些代码的用处是将$config
数组的内容重新写成php代码保存到文件@app/merge_config.php中
$str = '<?php '.PHP_EOL;
$str .= 'return '.PHP_EOL;
function toPhpCode($arr,$i=0){
$i++;
$tb_i = $i*4;
$tb = ($i-1)*4;
$tb1_str = '';
$tb2_str = '';
for($j=0;$j<$tb;$j++){
$tb1_str .= ' ';
}
for($jj=0;$jj<$tb_i;$jj++){
$tb2_str .= ' ';
}
$mystr = '';
if(is_array($arr) && !empty($arr)){
$mystr .= PHP_EOL .$tb1_str.'['.PHP_EOL;
$t_arr = [];
foreach($arr as $k => $v){
$key = '';
$value = '';
if(is_string($k)){
$key = "'".$k."'";
}else{
$key = $k;
}
if(is_array($v) && !empty($v)){
$value = toPhpCode($v,$i);
}else if(is_array($v) && empty($v)){
$value = '[]';
}else{
if(is_string($v)){
$value = "'".$v."'";
}else if(is_bool($v)){
if($v){
$value = 'true';
}else{
$value = 'false';
}
}else{
if(is_null($v)){
$v = "''";
}
$value = $v;
}
}
$t_arr[] = $tb2_str.$key."=>".$value;
}
$mystr .= implode(','.PHP_EOL,$t_arr);
$mystr .= PHP_EOL .$tb1_str.']'. PHP_EOL;
}
return $mystr;
}
$str .= toPhpCode($config);
$str .= ';';
echo 'generate merge config file success';
file_put_contents('../merge_config.php', $str);
echo 'generate merge config file success';
执行这个文件后,就会将$config数组的内容,以php代码的方式写入到merge_config.php,这样就生成了单文件配置。
在index.php中加载单文件配置
$use_merge_config_file = true;
if($use_merge_config_file){
$config = require('../merge_config.php');
}else{
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php'),
# fecshop services config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/config/fecshop.php'),
# fecshop module config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/app/appfront/config/appfront.php'),
# thrid part confing
# common modules and services.
require(__DIR__ . '/../../common/config/fecshop_local.php'),
# appadmin local modules and services.
require(__DIR__ . '/../config/fecshop_local.php')
);
}
这样就完成了。
下面fecshop的代码我粘贴一下:(供参考)
index.php:
<?php
error_reporting(E_ALL || ~E_NOTICE); //除去 E_NOTICE 之外的所有错误信息
ini_set('session.cookie_domain', '.fancyecommerce.com'); //初始化域名,
$http = ($_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
$homeUrl = $http.'://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['SCRIPT_NAME']), '\\/');
/**
* fecshop 使用合并配置(config)数组进行加速,true 代表打开。
* 打开配置加速开关前,您需要执行 http://domain/index-merge-config.php 进行生成单文件配置数组。
* 注意:打开后,当您修改了配置,都需要访问一次上面的链接,重新生成单文件配置数组,否则修改的配置不会生效
* 建议:本地开发环境关闭,开发环境如果访问量不大,关闭也行,如果访问量大,建议打开
*
*/
$use_merge_config_file = false;
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/yii/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');
if($use_merge_config_file){
$config = require('../merge_config.php');
}else{
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php'),
# fecshop services config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/config/fecshop.php'),
# fecshop module config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/app/appfront/config/appfront.php'),
# thrid part confing
# common modules and services.
require(__DIR__ . '/../../common/config/fecshop_local.php'),
# appadmin local modules and services.
require(__DIR__ . '/../config/fecshop_local.php')
);
}
$config['homeUrl'] = $homeUrl;
/**
* yii class Map Custom
*
*/
$yiiClassMap = require(__DIR__ . '/../config/YiiClassMap.php');
if(is_array($yiiClassMap) && !empty($yiiClassMap)){
foreach($yiiClassMap as $namespace => $filePath){
Yii::$classMap[$namespace] = $filePath;
}
}
/**
* 添加fecshop的服务 ,Yii::$service , 将services的配置添加到这个对象。
* 使用方法:Yii::$service->cms->article;
* 上面的例子就是获取cms服务的子服务article。
*/
new fecshop\services\Application($config['services']);
unset($config['services']);
$application = new yii\web\Application($config);
$application->run();
index-merge-config.php
<?php
error_reporting(E_ALL ); //除去 E_NOTICE 之外的所有错误信息
ini_set('session.cookie_domain', '.fancyecommerce.com'); //初始化域名,
$http = ($_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/yii/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php'),
# fecshop services config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/config/fecshop.php'),
# fecshop module config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/app/appfront/config/appfront.php'),
# thrid part confing
# common modules and services.
require(__DIR__ . '/../../common/config/fecshop_local.php'),
# appadmin local modules and services.
require(__DIR__ . '/../config/fecshop_local.php')
);
$str = '<?php '.PHP_EOL;
$str .= 'return '.PHP_EOL;
function toPhpCode($arr,$i=0){
$i++;
$tb_i = $i*4;
$tb = ($i-1)*4;
$tb1_str = '';
$tb2_str = '';
for($j=0;$j<$tb;$j++){
$tb1_str .= ' ';
}
for($jj=0;$jj<$tb_i;$jj++){
$tb2_str .= ' ';
}
$mystr = '';
if(is_array($arr) && !empty($arr)){
$mystr .= PHP_EOL .$tb1_str.'['.PHP_EOL;
$t_arr = [];
foreach($arr as $k => $v){
$key = '';
$value = '';
if(is_string($k)){
$key = "'".$k."'";
}else{
$key = $k;
}
if(is_array($v) && !empty($v)){
$value = toPhpCode($v,$i);
}else if(is_array($v) && empty($v)){
$value = '[]';
}else{
if(is_string($v)){
$value = "'".$v."'";
}else if(is_bool($v)){
if($v){
$value = 'true';
}else{
$value = 'false';
}
}else{
if(is_null($v)){
$v = "''";
}
$value = $v;
}
}
$t_arr[] = $tb2_str.$key."=>".$value;
}
$mystr .= implode(','.PHP_EOL,$t_arr);
$mystr .= PHP_EOL .$tb1_str.']'. PHP_EOL;
}
return $mystr;
}
$str .= toPhpCode($config);
$str .= ';';
echo 'generate merge config file success';
file_put_contents('../merge_config.php', $str);
echo 'generate merge config file success';
Fecshop 深圳
注册时间:2016-01-21
最后登录:2024-08-13
在线时长:73小时36分
最后登录:2024-08-13
在线时长:73小时36分
- 粉丝157
- 金钱2381
- 威望490
- 积分8011
共 1 条评论
最后,推荐一下我的开源商城:Fecshop。
Github地址:https://github.com/fancyecommerce/yii2_fecshop
Fecshop 全称为Fancy ECommerce Shop,是基于php Yii2框架之上开发的一款优秀的开源电商系统,遵循OSL3.0协议, Fecshop支持多语言,多货币,架构上支持pc,手机web,手机app,和erp对接等入口,您可以免费快速的定制和部署属于您的电商系统。
FecShop English Demo:http://fecshop.appfront.fancyecommerce.com/
FecShop 中文演示地址:http://fecshop.appfront.fancyecommerce.com/cn
FecShop QQ群:186604851 ,入群验证:fecshop