PHP创建缓存文件

文件操作类

<?php
/**
    文件操作类
*/
class FileIO
{
    /**
     * 读取目录
     * @param    string $dirPath dir名称
     * @return    array  返回数组
     */
    function getDirFile($dirPath)
    {
        $fArray = array();
        $dArray = array();
        //如果是文件
        if(FileIO::isFileExists($dirPath))
        {
            $fArray[] = $dirPath;
            return array('file'=>$fArray,'dir'=>$dArray);
        }
        //如果不是目录
        if(!FileIo::isDirExists($dirPath))
        {
            return array('file'=>$fArray,'dir'=>$dArray);
        }
        $handle=opendir($dirPath);
        while($file=readdir($handle))
        {
            if($file=='.' || $file=='..') continue;
            $fileName = $dirPath.$file;
            if(FileIo::isDirExists($fileName))
            {
                $dArray[] = $file;
            }
            if(FileIO::isFileExists($fileName))
            {
                $fArray[] = $file;
            }
        }
        closedir($handle);
        return array('file'=>$fArray,'dir'=>$dArray);
    }

    /**
     * 取得文件后缀(只取得文件的最后一个后缀名)
     * @param    string    $fileName    文件名        
     * @return    string    $fileType    文件后缀
     */
    function getFileType($fileName)
    {
        return strtolower(end(explode('.',$fileName)));
    }

    /**
     * 写入一个文件
     * @param $fileName    文件名称
     * @param $data        文件里写入的内容
     * @param $mode        文件写入模式
     * @param $isCp        是否创建备份文件
     * @return bool        成功返回true
     * @example
     * $f = new FileIO();
     * $f->writeFile('list/aaa/test.php','<?php phpinfo(); ?>','',true);
     * 在当前目录list/aaa文件夹下创建test.php文件
     */
    function writeFile($fileName,$data,$mode="",$isCp=false)
    {
        $fileName = str_replace("\","/",$fileName);
        $dirName = dirname( $fileName ); //获得部分文件目录
        if( !FileIo::isDirExists($dirName) ) //如果不是目录
        {
            if( !FileIo::createDir($dirName) ) //如果不能建立目录
            {
                return false; 
            }
        }
        //建立备份文件
        if( FileIO::isFileExists($fileName) && $isCp ) //判断文件是否存在
                FileIO::copyFile($fileName,$fileName."_".date("Y,m,d,H,i,s")); //复制文件,成功返回true
        if( function_exists("file_put_contents") && empty($mode) ) //如果方法存在与$mode是空
        {
            //将$date以字符串写入$fileName文件里面
            $inputLen = file_put_contents($fileName,strval($data)); 
            if( $inputLen != strlen($data) ) //如果$inputLen 没有长度
            {
                return false; 
            }
        } else {
            $mode .= empty($mode)?"w+":"b"; //是空就写入,否则就是二进制b
            $fp = fopen($fileName,$mode);
            if( !$fp )
            {
                return false;
            }
            fwrite($fp,$data,strlen($data)); //写入数据
            @fclose($fp); //关闭数据 
        }
        return true;
    }

    /**
     * 建立目录
     * @parma    $dirName 目录名称
     * @return    bool     成功返回true
     * @example
     * $f = new FileIO();
     * $f->createDir('list/aaa'); 当前目录下创建list/aaa文件夹
     */
    function createDir($dirName)
    {
        $dirName = str_replace("\","/",$dirName);
        $dirArr = explode('/',$dirName);
        //增加对绝对目录的判断
        if(substr($dirName,0,1)=='/')
            $dirTemp = "/";
        else
            $dirTemp = "";
        foreach( (array)$dirArr as $dir )
        {
            if( empty($dir) ) continue;
            $dirTemp.= $dir."/";
            if( !is_dir($dirTemp) )
            {
                if( !@mkdir($dirTemp,0777) )
                {
                    return false;
                }
                chmod($dirTemp,0777);
            }
        }
        return true;
    }

    /**
     * 取得文件的内容
     * @parma    string    $fileName    要取得的文件名称
     * @return    如果失败返回 false    成功返回文件内容
     * @example
     * $f = new FileIO();
     * $f->fileGetContent('list/aaa/test.php') 读取test.php文件的内容
     */
    function fileGetContent( $fileName )
    {
        if( !FileIO::isFileExists($fileName) ) return false;
        if( function_exists("file_get_contents") )
            return file_get_contents( $fileName );
        else
            return fread( fopen($fileName,"r"),filesize($fileName)+1 );
    }

    /**
     * 判断一个文件是否存在
     * @param    string    $fileName 判断的文件名称
     * @return    bool    如果存在返回true
     */
    function isFileExists( $fileName )
    {
        clearstatcache();
        return file_exists( $fileName ) && is_file( $fileName );
    }

    /**
     * 判断一个目录是否存在
     * @param    $dirName    判断的文件名称
     * @return    bool        如果存在返回true
     */
    function isDirExists( $dirName )
    {
        clearstatcache();
        return file_exists( $dirName ) && is_dir( $dirName );
    }

    /**
     * 删除文件
     * @param    $fileName    删除的文件名称    
     * @return    bool        删除成功返回true
     */
    function delFile($fileName)
    {
        if( FileIO::isFileExists($fileName) )
            return unlink($fileName);
        return true;
    }

    /**
     * 删除目录
     * @param    $dirName    删除的目录名称    
     * @return    bool        删除成功返回true
     */
    function delDir($dirName)
    {
        if( !FileIO::isDirExists($dirName) )
        {
            return false;
        }
        $handle = @opendir($dirName);
        while(false !== ($file = @readdir($handle)))
        {
            if($file != "." && $file != "..")
            {
                @chmod($dirName . "/" . $file, 0777); //改变文件模式
                if(FileIO::isDirExists($dirName . "/" . $file))  //判断目录是否存在
                {
                    FileIO::delDir($dirName . "/" . $file); //存在就删除目录
                } else {
                    if( !FileIO::delFile($dirName . "/" . $file)) return false;
                }
            }
        }
        @closedir($handle);
        @rmdir($dirName);
        return true;
    }

    /**
     * 文件复制
     * @param    $source    源文件
     * @param    $dest    目标文件
     * return    bool    复制成功返回true
     */
    function copyFile($source, $dest)
    {
        if( !FileIO::isFileExists($source) ) return false;
        $destDir = dirname($dest);
        if( !FileIO::isDirExists($destDir))
        {
            if( !FileIO::createDir($destDir) ) return false;
        }
        return copy($source, $dest);
    }

    /**
     * 目录复制
     * @param    $source    源文件
     * @param    $dest    目标文件
     * return    bool    复制成功返回true
     */
    function copyDir($source, $dest)
    {
        if( !FileIO::isDirExists($source) ) return false;
        if( !FileIO::isDirExists($dest) ) FileIO::createDir( $dest );
        $handle = @opendir($source);
        while(false !== ($file = @readdir($handle)))
        {
            if($file != "." && $file != "..")
            {
                @chmod($source . "/" . $file, 0777);
                if( FileIO::isDirExists($source . "/" . $file) )
                { 
                    FileIO::copyDir( $source."/".$file."/",$dest."/".$file."/" );
                } else {
                    if( !FileIO::copyFile( $source."/".$file,$dest."/".$file ) )
                    {
                        @closedir($handle);
                        return false;
                    }
                }
            }
        }
        @closedir($handle);
        return true;
    }

    /**
     * 文件移动
     * @param    $source    源文件
     * @param    $dest    目标文件
     * return    bool    复制成功返回true
     */
    function moveFile($source,$dest)
    {
        return FileIO::copyFile($source,$dest) && FileIo::delFile($source);
    }

    /**
     * 目录移动
     * @param    $source    源文件
     * @param    $dest    目标文件
     * return    bool    复制成功返回true
     */
    function moveDir($source,$dest)
    {
        return FileIO::copyDir($source,$dest) && FileIo::delDir($source);
    }

    /**
     * 根据数组建立缓存数组文件
     * @param  $result        建立的数据数组
     * @param  $cacheName    建立的数组名称,文件名为.data.php
     * @param  $dir            建立文件保存的地址
     * @param  $expire        缓存到期时间,以分钟为单位,默认为1小时
     */
    function makeArrayCache($result,$cacheName,$dir,$expire=60)
    {
        $temp[] ="<?php";
        $temp[] ="$create_time=".time().";";
        $temp[] ="${$cacheName} = array();";
        foreach($result as $key => $value)
        {
            if(preg_match("/^[d]$/i",$key))
                $temp[] = "${$cacheName}[{$key}]="{$value}";";
            else
                $temp[] = "${$cacheName}['{$key}']="{$value}";";
        }
        $temp[] = "if(time() - $create_time > $expire * 60) return false;";
        $temp[] = "return ${$cacheName};";
        $temp[] = "?>";
        $fileName = $dir."{$cacheName}.data.php";
        unset($result);
        return $make = FileIO::writeFile($fileName,implode("
",$temp));
    }

    /**
     * 根据字符串建立缓存文件
     * @param  $str            建立的字符串
     * @param  $cacheName    建立的数组名称,文件名为 .data.php
     * @param  $dir            建立文件保存的地址
     * @param  $expire        缓存到期时间,以分钟为单位,默认为1小时
     */
    function makeStringCache($str,$cacheName,$dir,$expire=60)
    {
        $temp[] ="<?php";
        $temp[] ="$create_time=".time().";";
        $temp[] ="${$cacheName} = '{$str}';";
        $temp[] = "if(time() - $create_time > $expire * 60) return false;";
        $temp[] = "return ${$cacheName};";
        $temp[] = "?>";
        $fileName = $dir."{$cacheName}.data.php";
        unset($result);
        return $make = FileIO::writeFile($fileName,implode("
",$temp));
    }

    /**
     * 获取Hash文件名
     * @param  $str 为hash的字段
     * @return fileName 为hash后的文件名,加目录名
     */
    function getHashFileName($str,$isFileName=false)
    {
        $fileName = "";
        $hashTemp = md5(strval($str));
        $fileName .=substr($hashTemp,0,2)."/";//一级目录为256个
        $fileName .=substr($hashTemp,2,2)."/";//二级目录下单个目录为 256个
        $fileName .=substr($hashTemp,4,3);//三级目录下单个目录为 4096个
        if($isFileName)
        {
            $fileName.=substr($hashTemp,7);
        }
        return $fileName;
    }

    /**
     * 判断文件的过期时间
     * @param  $fileName  文件名
     * @param  $overTime  过期时间
     * @return 过期返回true
     */
    function isOverTime($fileName,$overTime)
    {
        //如果传递为0的话则默认为永久缓存
        if($overTime) {
            if(FileIO::isFileExists($fileName))
            {
                if(time()-filemtime($fileName)>$overTime)
                {
                    return true;
                } else {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }
    }
}

调用方式

<?php
include("FileIO.class.php");
$f = new FileIO();
$filename = "test.data.php";
if(!$f->isFileExists($filename)) {
    $f->writeFile($filename, '');
}
$rs = include($filename);
var_dump($rs);
if($rs === false) {
    $f->makeStringCache("kkkkk|sfsfdsdf|asdfdsfds",'test','./',1);
}
原文地址:https://www.cnblogs.com/phpfans/p/3182115.html