长沙网站开发_TP3.2使用F函数读写配置文件问题

发布日期:2016-11-25 15:54

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对文件进行写入。

 
以上信息由长沙网站建设--长沙蒲公英网络收集与整理,禁止用于任何商业行为