深入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 &amp;&amp; 逻辑与运算符使用说明
Mar 04 PHP
PHP性能优化 产生高度优化代码
Jul 22 PHP
PHP随机生成随机个数的字母组合示例
Jan 14 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
Sep 04 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
PHP弹出对话框技巧详细解读
Sep 26 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
php微信开发之音乐回复功能
Jun 14 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 23 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/03/02 国漫
PHP里的单例类写法实例
2015/06/25 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
js 窗口抖动示例
2013/09/04 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
基于webpack.config.js 参数详解
2018/03/20 Javascript
微信小程序自定义轮播图
2018/11/04 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
Vuex的各个模块封装的实现
2020/06/05 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
Django Admin实现上传图片校验功能
2016/03/06 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
简单了解Django ContentType内置组件
2019/07/23 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
表彰先进集体通报
2014/01/12 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
隐形的翅膀观后感
2015/06/10 职场文书