深入PHP数据缓存的使用说明


Posted in PHP onMay 10, 2013
<?php
// https://3water.com/article/23093.htm
function set_cache($name, $value) {
    // 设置相对或者绝对目录,末尾不要加 "/"
    $cache_dir = "./cache";
    // 设置扩展名
    $cache_extension = ".php";    $cache_str_begin = "<?php\n//Cache Created at: " . date ( "Y-m-d H:i:s" ) . "\n";
    if (! is_array ( $value )) {
        $cache_str_middle = "\$$name = \"$value\";";
    } else {
        $cache_str_middle = "\$$name = " . arrayeval ( $value ) . ";";
    }
    $cache_str_end = "\n?>";
    $cache_str = $cache_str_begin . $cache_str_middle . $cache_str_end;
    // 缓存文件路径
    $cache_file = "$cache_dir/$name$cache_extension";
    if ($fp = @fopen ( $cache_file, "wb" )) {
        fwrite ( $fp, $cache_str );
        fclose ( $fp );
        return true;
    } else {
        echo $cache_file;
        exit ( "Can not write to cache files, please check cache directory " );
        return false;
    }
}

// 将array变成字符串, 来自discuz!
function arrayeval($array, $level = 0) {
    if (! is_array ( $array )) {
        return "\"$array\"";
    }
    $space = "";
    for($i = 0; $i <= $level; $i ++) {
        $space .= "\t";
    }
    $evaluate = "Array\n$space(\n";
    $comma = $space;
    if (is_array ( $array )) {
        foreach ( $array as $key => $val ) {
            $key = is_string ( $key ) ? "\"" . addcslashes ( $key, "\"\\" ) . "\"" : $key;
            $val = ! is_array ( $val ) && (! preg_match ( "/^\-?[1-9]\d*$/", $val ) || strlen ( $val ) > 12) ? "\"" . addcslashes ( $val, "\"\\" ) . "\"" : $val;
            if (is_array ( $val )) {
                $evaluate .= "$comma$key => " . arrayeval ( $val, $level + 1 );
            } else {
                $evaluate .= "$comma$key => $val";
            }
            $comma = ",\n$space";
        }
    }
    $evaluate .= "\n$space)";
    return $evaluate;
}
$test_array = array (
        "6b" => "a\\",
        "b",
        "c",
        array (
                "c",
                "d" 
        ) 
);
$fileAndVarName = "newFile";
// 在生成$encode_str的时候,为使字符串中原有字符格式不变,系统在编译时会给字符串中预定义字符前加 \ 使预定义字符保留在字符串中,但输出或打印字符串的时候只会输出打印出预定义字符,不会打印出预定义字符前面的 \
$encode_str = json_encode ( $test_array );
// 因为这里要把字符串打印成PHP代码,输出的时候,字符串中预定义字符会打乱程序运行,所以要在原有转义字符前再加转移字符,使字符串输出打印时在预定义字符前转义字符也能输出
$addslashes_str = addslashes ( $encode_str ); // addslashes将字符串中预定义字符前加 \ 使其能存放在字符串中不产生作用,不参与程序运行
echo stripslashes($addslashes_str); // 反转义函数,可去掉字符串中的反斜线字符。若是连续二个反斜线,则去掉一个,留下一个。若只有一个反斜线,就直接去掉。
echo "<br>";

// 可以传数组对象,也可以传转换成json的字符串,转换成json字符串,使用时需要再转换成数组
set_cache ( "$fileAndVarName", $addslashes_str );
var_dump ( $addslashes_str );
echo "<br/>";
include_once "./cache/$fileAndVarName.php";
var_dump ( $$fileAndVarName );
echo "<br/>";
$decode_arr = ( array ) json_decode ( $$fileAndVarName );
var_dump ( $decode_arr );
echo "<br/>";
 
// 缓存另一种方法,用serialize把数组序列号成字符串,存放在任意扩展名文件中,使用时用fopen打开读取其中字符串内容,再用unserialize反序列化成原数据
$serialize_str = serialize ( $test_array );
echo $serialize_str; // 这个就是描述过的数组但在这里是一个字符串而已
echo "<br/>";
$unserialize_str = unserialize ( $serialize_str ); // 把描述过的数据恢复
var_dump($unserialize_str); //还原成为 $test_array ,数组结构并没有丢失。
?>
PHP 相关文章推荐
C# Assembly类访问程序集信息
Jun 13 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
php 缩略图实现函数代码
Jun 23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
PHP的Yii框架中View视图的使用进阶
Mar 29 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
php多线程并发实现方法
Sep 30 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
Apr 09 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 PHP
基于PHP常用函数的用法详解
May 10 #PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 #PHP
PHP 自定义错误处理函数的使用详解
May 10 #PHP
PHP 类相关函数的使用详解
May 10 #PHP
解析PHP缓存函数的使用说明
May 10 #PHP
基于PHP选项与信息函数的使用详解
May 10 #PHP
PHP 观察者模式的实现代码
May 10 #PHP
You might like
php编写一个简单的路由类
2011/04/13 PHP
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
传智播客学习之java 反射
2009/11/22 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
js数组的基本使用总结
2021/01/18 Javascript
Python中给List添加元素的4种方法分享
2014/11/28 Python
用pycharm开发django项目示例代码
2018/10/24 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
python实现处理mysql结果输出方式
2020/04/09 Python
Python如何输出警告信息
2020/07/30 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
过滤器的用法
2013/10/08 面试题
个人承诺书
2014/03/26 职场文书
闪闪红星观后感
2015/06/08 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
一文搞懂Python Sklearn库使用
2021/08/23 Python
Python编写冷笑话生成器
2022/04/20 Python