深入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 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
解决File size limit exceeded 错误的方法
Jun 14 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
PHP面试题之文件目录操作
Oct 15 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
php+redis实现消息队列功能示例
Sep 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
DC动漫人物排行
2020/03/03 欧美动漫
php 数组的指针操作实现代码
2011/02/08 PHP
通过dbi使用perl连接mysql数据库的方法
2014/04/16 PHP
js资料prototype 属性
2007/03/13 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
socket + select 完成伪并发操作的实例
2017/08/15 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
Python socket 套接字实现通信详解
2019/08/27 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Python截图并保存的具体实例
2021/01/14 Python
html5 web本地存储将取代我们的cookie
2012/12/26 HTML / CSS
美国社交购物市场:MassGenie
2019/02/18 全球购物
What is EJB
2016/07/22 面试题
餐饮管理自我介绍信
2014/01/15 职场文书
校长先进事迹材料
2014/02/01 职场文书
元旦促销方案
2014/03/15 职场文书
工会文体活动总结
2015/05/07 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
对象析构函数__del__在Python中何时使用
2022/03/22 Python