深入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 相关文章推荐
建立动态的WML站点(二)
Oct 09 PHP
中英文字符串翻转函数
Dec 09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
PHP中使用cURL实现Get和Post请求的方法
Mar 13 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
PHP中Trait及其应用详解
Feb 14 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
PHP数组基本用法与知识点总结
Jun 02 PHP
七种PHP开发环境搭建工具
Jun 28 PHP
PHP与Web页面的交互示例详解一
Aug 04 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与服务器文件系统的简单交互
2016/10/21 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
Array.prototype 的泛型应用分析
2010/04/30 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
PyQt5 多窗口连接实例
2019/06/19 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
女方回门宴答谢词
2014/01/14 职场文书
两只小狮子教学反思
2014/02/05 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
2015年加油站工作总结
2015/05/13 职场文书
我是特种兵观后感
2015/06/11 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL