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("\n",$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("\n",$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); }