深入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基础知识:控制结构
Dec 13 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
Laravel实现批量更新多条数据
Apr 06 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抓取页面与代码解析 推荐
2010/07/23 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
php源码的使用方法讲解
2019/09/26 PHP
Jquery 切换不同图片示例代码
2013/12/05 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
简单介绍Python中的decode()方法的使用
2015/05/18 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
python实现任意位置文件分割的实例
2018/12/14 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
创建Django项目图文实例详解
2019/06/06 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
德国网上花店:Valentins
2018/08/15 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
行风评议整改报告
2014/11/06 职场文书
2014年检验员工作总结
2014/11/19 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis