yii2 配置加速 – N个配置文件生成一个配置文件

技巧库 · fecommerce · 于 2年前 发布 · 1525 次阅读

原文链接: 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';

本文由 fecommerce 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。


微信

共收到 3 条回复
fecommerce#12年前 0 个赞

最后,推荐一下我的开源商城: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

upliu#22年前 0 个赞

配置文件里面是可以有函数的,这样生成恐怕不妥。

return [

'foo' => function(){ return new Foo(); }

];

fecommerce#32年前 0 个赞

@upliu #2楼 奥,您说的很对,这个只能我自己用了,我的配置文件里面不写函数。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册