深入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基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
PHP HTML代码串截取代码
Dec 29 PHP
php 变量定义方法
Jun 14 PHP
PHP中读写文件实现代码
Oct 20 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
PHP编写简单的App接口
Aug 28 PHP
PHP实现生成数据字典功能示例
May 24 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
关于laravel 日志写入失败问题汇总
Oct 17 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无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
启动一个线程是用run()还是start()
2016/12/25 面试题
物业招聘计划书
2014/01/10 职场文书
认识深刻的检讨书
2014/02/16 职场文书
气象学专业个人求职信
2014/03/15 职场文书
珠宝店促销方案
2014/03/21 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
论文答谢词
2015/01/20 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
部门主管竞聘书
2015/09/15 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript