深入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函数代码
Apr 22 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
May 16 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
php版微信小店调用api示例代码
Nov 12 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
Laravel 创建指定表 migrate的例子
Oct 09 PHP
PHP+MySql实现一个简单的留言板
Jul 19 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中的字符串函数
2006/11/24 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
三级下拉菜单的js实现代码
2011/05/23 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
express express-session的使用小结
2018/12/12 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
利用python爬取软考试题之ip自动代理
2017/03/28 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
python关闭占用端口方式
2019/12/17 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
房地产开盘策划方案
2014/02/10 职场文书
酒店管理求职信范文
2014/04/06 职场文书
见习报告的格式
2014/10/31 职场文书
股权转让协议书
2014/12/07 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
redis限流的实际应用
2021/04/24 Redis
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python