TP3.2使用F函数读写配置文件问题-缓存文件写入失败

TP3.2使用F函数读写配置文件问题ThinkPHP作为一款快速、兼容而且简单的轻量级国产PHP开源框架,得到了众多程序员的喜爱。虽然其他更优秀的框架都渐渐引入进来,但还是有很多TP粉继续在坚持使用。

最近在进行长沙网站开发时,想通过F函数更新验证码的配置信息,但保存时提示失败~F('verify', $_POST, CONF_PATH)这句代码在TP3.1版本中是可以正常使用的,升级到3.2后保存内容变成了这样(眼花缭乱的感觉有木有):

a:10:{s:13:"VERIFY_LENGTH";s:1:"5";s:12:"VERIFY_WIDTH";s:3:"250";s:13:"VERIFY_HEIGHT";s:2:"50";s:14:"VERIFY_BGCOLOR";s:7:"#F3FBFE";s:11:"VERIFY_SEED";s:51:"3456789aAbBcCdDeEfFgGhHjJkKmMnNpPqQrRsStTuUvVwWxXyY";s:15:"VERIFY_FONTFILE";s:8:"font.ttf";s:11:"VERIFY_SIZE";s:2:"30";s:12:"VERIFY_COLOR";s:7:"#444444";s:11:"VERIFY_NAME";s:6:"verify";s:11:"VERIFY_FUNC";s:10:"strtolower";}

通常的结果(这样感觉好多了~):

<?php return array (

'VERIFY_LENGTH' => '5',

'VERIFY_WIDTH' => '250',

'VERIFY_HEIGHT' => '50',

'VERIFY_BGCOLOR' => '#F3FBFE',

'VERIFY_SEED' => '3456789aAbBcCdDeEfFgGhHjJkKmMnNpPqQrRsStTuUvVwWxXyY',

'VERIFY_FONTFILE' => 'font.ttf',

'VERIFY_SIZE' => '30',

'VERIFY_COLOR' => '#444444',

'VERIFY_NAME' => 'verify',

'VERIFY_FUNC' => 'strtolower',

);

仔细研究一样内容结构,了解过session的朋友应该会觉得很眼熟—序列化(serialize)。保存时格式为:变量类型(简写):长度:变量名(内容)。我们更深入的寻找一下结果,打开/ThinkPHP/Common/functions.php—保存公共函数的文件,找到F函数定义部分:

function F($name, $value='', $path=DATA_PATH) {

static $_cache = array();

$filename = $path . $name . '.php';

if ('' !== $value) {

if (is_null($value)) {

// 删除缓存

if(false !== strpos($name,'*')){

return false; // TODO

}else{

unset($_cache[$name]);

return Think\Storage::unlink($filename,'F');

}

} else {

Think\Storage::put($filename,serialize($value),'F');

// 缓存数据

$_cache[$name] = $value;

return null;

}

}

// 获取缓存数据

if (isset($_cache[$name]))

return $_cache[$name];

if (Think\Storage::has($filename,'F')){

$value = unserialize(Think\Storage::read($filename,'F'));

$_cache[$name] = $value;

} else {

$value = false;

}

return $value;

}

我们可以清楚的看到,3.2版本中F函数在进行文件写入时,使用是serialize函数进行序列化,在读取时对内容进行反序列化。

了解了TP的处理流程,我们应对的方法有很多种:1.最简单粗暴直接将F函数中的序列化动作去掉,优点--简单;缺点--会导致后续使用时出异想不到的问题;2.自定义函数进行处理,优点--可以get到新技能;缺点--需要多花点时间,其他。。。其他没有缺点;3.直接处理。。。笔者比较懒,没有封装函数,使用了第三种方法:

$verify = '<?php return ' . var_export(I('post.'), true) . ';';

if(file_put_contents(CONF_PATH . 'verify.php', $verify)){

$this->success('修改成功!', U(MODULE_NAME . '/System/verify'));

}else{

E('保存失败,请修改' . CONF_PATH . 'verify.php权限!');

}

主要使用了var_export函数输出数组(可输出合法的PHP代码,并可以赋值给变量),使用file_put_contents对文件进行写入。

更多 长沙网站开发 原创内容,请关注长沙蒲公英网络。

原创文章链接: http://www.0731pgy.com/a/news/IndustryNews/428.html

推荐阅读