我正在尝试使用CodeIgniter构建一个小型CMS,我需要能够动态更新application / config.php中的一些变量
到目前为止,我做到了:
private function update_file ($file, $var, $var_name) {
$start_tag = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
if (file_exists($file)) {
require_once ($file);
$updated_array = array_merge($$var_name, $var);
$data = $start_tag."\$".$var_name." = ".var_export($updated_array, true).";";
file_put_contents($file, $data);
} else {
return false;
}
}
一切正常! config.php文件中的结果为:
<?php ...;
$config = array (
'base_url' => '',
...
...
);
但是如果我想用注释,空格和
来维护原始的config.php文件格式怎么办?
分隔声明$ config ['key'] ='value'......?
这可能吗?
编辑:
感谢您的回答,非常珍贵。 我找到了一个稍微不同的解决方案来满足我的需求,在返回file_get_contents()时执行preg_replace,然后在文件中写回新生成的字符串。文件保持完全原始的干净格式。
private function update_file ($file, $var, $var_name) {
if (file_exists($file)) {
require_once ($file);
$contents = file_get_contents($file);
$updated_array = array_merge($$var_name, $var);
$search = array();
$replace = array();
foreach($$var_name as $key => $val) {
$pattern = '/\$'.$var_name.'\[\\\''.$key.'\\\'\]\s+=\s+[^\;]+/';
$replace_string = "\$".$var_name."['".$key."'] = ".var_export($updated_array[$key], true);
array_push($search, $pattern);
array_push($replace, $replace_string);
}
$new_contents = preg_replace($search, $replace, $contents);
write_file($file, $new_contents);
}
可能需要一些轻微的性能提升。但这是我的基本想法。
答案 0 :(得分:1)
创建空值
的键$config['base_url'] = '';
然后将它们设置在任何控制器中。 如果将值存储在db中,并在MY_Controller中初始化它们,则效果最佳。
$this->config->set_item('base_url', 'value');
答案 1 :(得分:0)
有可能。我找不到代码,但一旦我写了类似的东西。整个想法是基于标记化模板文件和替换数组中的值,保留模板中的键顺序,行号和注释。
[+]找到它。它的目的是从模板中填充看起来像这样的值(当然它要大得多):
<?php
$_CFG = array(
// DB section
'db_host' => 'localhost',
'db_user' => 'root',
'db_pass' => '',
'db_name' => 'test',
// Site specific
'lang' => array('pl','en'),
'admin' => 'admin@example.com',
);
正在做所有魔术的代码:
$tokens = token_get_all(file_get_contents('tpl/config.php'));
$level = -1;
$buffer = '';
$last_key = 0;
$iteration = 0;
foreach($tokens as $t){
if($t === ')'){
$iteration = 0;
$last_key = 0;
$level--;
}
if(is_array($t)){
if($t[0] == T_ARRAY && strtolower($t[1]) === 'array')
$level++;
if($t[0] == T_CONSTANT_ENCAPSED_STRING){
if($last_key){
if($level){
if(isset($new_config[$last_key][$iteration])){
$buffer .= var_export($new_config[$last_key][$iteration], TRUE);
}
else
$buffer .= 'null';
$iteration++;
}
else{
if(isset($new_config[$last_key]))
$buffer .= var_export($new_config[$last_key], TRUE);
else
$buffer .= 'null';
$last_key = 0;
}
}
else{
$buffer .= $t[1];
$last_key = trim($t[1],"'");
}
}
else
$buffer .= $t[1];
}
else
$buffer .= $t;
}
file_put_contents('config.php',$buffer);