index-merge-config.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. error_reporting(E_ALL & ~E_NOTICE & ~E_COMPILE_WARNING ); //除去 E_NOTICE E_COMPILE_WARNING 之外的所有错误信息
  3. #ini_set('session.cookie_domain', '.fancyecommerce.com'); //初始化域名,
  4. $http = ($_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
  5. $homeUrl = $http.'://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['SCRIPT_NAME']), '\\/');
  6. defined('YII_DEBUG') or define('YII_DEBUG', false);
  7. defined('YII_ENV') or define('YII_ENV', 'prod');
  8. defined('FEC_APP') or define('FEC_APP', 'appbdmin');
  9. require(__DIR__ . '/../../vendor/autoload.php');
  10. require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/yii/Yii.php');
  11. $fecmall_common_main_local_config = require(__DIR__ . '/../../common/config/main-local.php');
  12. require(__DIR__ . '/../../common/config/bootstrap.php');
  13. require(__DIR__ . '/../config/bootstrap.php');
  14. $config = yii\helpers\ArrayHelper::merge(
  15. require(__DIR__ . '/../../common/config/main.php'),
  16. $fecmall_common_main_local_config,
  17. require(__DIR__ . '/../config/main.php'),
  18. require(__DIR__ . '/../config/main-local.php'),
  19. # fecshop 公用配置
  20. require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/config/fecshop.php'),
  21. # fecshop 入口配置
  22. //require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/app/appadmin/config/appadmin.php'),
  23. # thrid part confing
  24. # 第三方 公用配置
  25. require(__DIR__ . '/../../common/config/fecshop_third.php'),
  26. # 第三方 入口配置
  27. require(__DIR__ . '/../config/fecshop_third.php'),
  28. # 本地 公用配置
  29. require(__DIR__ . '/../../common/config/fecshop_local.php'),
  30. # 本地 入口配置
  31. require(__DIR__ . '/../config/fecshop_local.php')
  32. );
  33. $config['homeUrl'] = $homeUrl;
  34. $str = '<?php '.PHP_EOL;
  35. $str .= 'return '.PHP_EOL;
  36. /**
  37. * 下面是fecshop热心用户【phoenix】优化后的代码: http://www.fecshop.com/member/phoenix
  38. * 从下面开始到 `$str .= toPhpCode($config);` 代码结束部分。
  39. */
  40. /**
  41. * 单个制表符用几个空格来表示
  42. */
  43. const TAB_DEFAULT_SPACES = 4;
  44. /**
  45. * 获取某维的缩进空格字符串
  46. * @param $dimensional 维数,即当前在数组的第几层。
  47. * @return string 返回当前层的缩进空格的字符串
  48. */
  49. function obtainSpaces($dimensional)
  50. {
  51. $spaceNumber = $dimensional * TAB_DEFAULT_SPACES;
  52. $spaceStr = '';
  53. for ($index = 0; $index < $spaceNumber; $index++) {
  54. $spaceStr .= ' ';
  55. }
  56. return $spaceStr;
  57. }
  58. /**
  59. * 格式化字符串和其它非引用类型
  60. * @param $val 数组的键值对里的值
  61. * @return string 返回相应类型所对应的字符串
  62. */
  63. function formatStringAndOther($val)
  64. {
  65. if (is_string($val)) {
  66. return "'".$val."'";
  67. }
  68. if (is_bool($val)) {
  69. return $val? 'true' : 'false';
  70. }
  71. return is_null($val)? "''" : $val;
  72. }
  73. /**
  74. * 用ReflectionFunction来获取闭环对象所在源文件的一些信息
  75. * 再根据信息得到相应代码并打印到缓存中,再从缓存中返回字符串
  76. * @param $val 数组中键值对里的值,即要反射出原代码的闭环对象。
  77. * @return string 返回闭环对象对应的代码
  78. */
  79. function formatClosureObject($val)
  80. {
  81. $code_str = '';
  82. ob_start();
  83. ob_implicit_flush(false);
  84. $func = new ReflectionFunction($val);
  85. $filename = $func->getFileName();
  86. $start_line = $func->getStartLine(); //作者原来在这里“-1”很灵巧。但为可读性好一点改到下面的"+1"和"-1"了。
  87. $end_line = $func->getEndLine();
  88. $length = $end_line - $start_line + 1;
  89. $source = file($filename);
  90. $code = implode("", array_slice($source, $start_line - 1, $length));//file转成数组后行数从零开始故减一
  91. echo $code;
  92. $code_str = ob_get_clean();
  93. return $code_str;
  94. }
  95. /**
  96. * 格式化数组(格式化成字符串)
  97. * @param $arr 要格式化的数组
  98. * @param $dimensional 维度,即当前数组处于被嵌套在第几层中
  99. * @param $pre_sapces_str 上一维度的输出空格字符串
  100. * @param $curr_spaces_str 当前维度的输出空格字符串
  101. * @return string 数组格式化后所得字符串
  102. */
  103. function formatArray($arr,$dimensional,$pre_sapces_str,$curr_spaces_str)
  104. {
  105. $str = PHP_EOL.$pre_sapces_str.'['.PHP_EOL;
  106. $eol_flag = 1;
  107. foreach ($arr as $k => $v) {
  108. 1 != $eol_flag && $str .= PHP_EOL;
  109. $eol_flag = -1;
  110. $key = is_string($k) ? "'" . $k . "'" : $k;
  111. $value = '';
  112. if (is_object($v)) {
  113. $value = formatClosureObject($v);
  114. $str .= $value;
  115. $eol_flag = 1;
  116. continue;
  117. }
  118. if (is_array($v)) {
  119. $value = toPhpCode($v, $dimensional);
  120. }else{
  121. $value = formatStringAndOther($v);
  122. }
  123. $str .= $curr_spaces_str . $key . '=>' . $value . ',';
  124. }
  125. $str .= PHP_EOL.$pre_sapces_str.']';
  126. return $str;
  127. }
  128. /**
  129. * 转成php代码
  130. * @param $arr 要转的数组
  131. * @param int $dimensional 维度,即当前数组处于被嵌套在第几层中
  132. * @return string 格式化后所得字符串
  133. */
  134. function toPhpCode($arr, $dimensional = 0)
  135. {
  136. if (!is_array($arr)) {
  137. return formatStringAndOther($arr);
  138. }
  139. $pre_sapces_str = obtainSpaces($dimensional);
  140. $dimensional++;
  141. $curr_spaces_str = obtainSpaces($dimensional);
  142. return formatArray($arr,$dimensional,$pre_sapces_str,$curr_spaces_str);
  143. }
  144. $str .= toPhpCode($config);
  145. $str .= ';';
  146. file_put_contents('../merge_config.php', $str);
  147. echo 'generate merge config file success';