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