深入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 相关文章推荐
解析php中call_user_func_array的作用
Jun 07 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
神盾加密解密教程(三)PHP 神盾解密工具
Jun 08 PHP
php可生成缩略图的文件上传类实例
Dec 17 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
php简单socket服务器客户端代码实例
May 18 PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 PHP
php获取小程序码的实现代码(B类接口)
Jun 13 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
php无限极分类实现的两种解决方法
2013/04/28 PHP
Thinkphp中数据按分类嵌套循环实现方法
2014/10/30 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
javascript动态加载三
2012/08/22 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
layui table 参数设置方法
2018/08/14 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
Python通过socketserver处理多个链接
2020/03/18 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
Django-imagekit的使用详解
2020/07/06 Python
Python实现弹球小游戏
2020/08/01 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
大学毕业生个人自荐信范文
2014/01/08 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
湘江北去观后感
2015/06/15 职场文书
angular4实现带搜索的下拉框
2022/03/25 Javascript