写了一段生成缓存的函数,大家觉得有什么不足之处?
代码的写的方式和风格方面,求评价//cacheid
function MakeThreeCache($ID)
{
  $idArr = array(
  'DIQU'    =>  array('id', 'name', '/cacheDiqu',   3,1,'中国','/1.php',"SELECT * FROM gk_common_diqu WHERE `level`=%d AND upid='%d' "),
  'INFOCAT' =>  array('id', 'name', '/cacheInfocat',3,0,'大分类','/0.php',"SELECT * FROM gk_info_cat WHERE `level`=%d AND `able`=1 AND upid='%d' "),
  );
  if(!array_key_exists($ID,$idArr)) return false;
  list($fnid,$fnvalue,$cacheDir,$deep,$upid1,$pos1,$firstFile,$selectSQL) = $idArr[$ID];  global $dsql;
  set_time_limit(0);
  $tm1 = microtime(true);
  $dir1 = DEDEDATA.$cacheDir;
  RmRecurse($dir1);//delete this dir first!  if(!is_dir($dir1) && !mkdir($dir1,0777)) exit('--|目录创建失败!'.$dir1 );
  $path1 = $dir1.$firstFile;
  $data1 = '<'."?php\n";
  $data1.= "\n/* CACHE: {$ID} : {$pos1}\t */";
  $data1.= "\n/* time:  ".date("Y-m-d H:i:s")." */";
  $data1.= "\n/* path:  ".$path1." */\n";
  $data1.= "\n\$CACHE['".$ID."'] = array(";  $dsql->Execute('s1',sprintf($selectSQL,1,$upid1));
  while($row1 = $dsql->GetArray('s1'))
  {
    $data1 .= "\n".$row1[$fnid]."\t=>\t'".$row1[$fnvalue]."',";    $tm2 = microtime(true);
    $pos2 = $pos1.' -> ['.$row1[$fnid].']'.$row1[$fnvalue];
    $dir2 = $dir1."/".$row1[$fnid];
    if(!is_dir($dir2) && !mkdir($dir2,0777))
    {
      echo("\n--|--|目录创建失败!".$dir2);
      continue;
    }
    $path2 = sprintf('%s/%d.php',$dir2,$row1[$fnid]);
    $data2 = '<'."?php\n";
    $data2.= "\n/* CACHE: {$ID} : {$pos2}\t */";
    $data2.= "\n/* time:  ".date("Y-m-d H:i:s")." */";
    $data2.= "\n/* path:  ".$path2." */\n";
    $data2.= "\n\$CACHE['".$ID."']['".$row1[$fnid]."'] = array(";    $dsql->Execute('s2',sprintf($selectSQL,2,$row1[$fnid]));
    while($row2 = $dsql->GetArray('s2'))
    {
      $data2 .= "\n".$row2[$fnid]."\t=>\t'".$row2[$fnvalue]."',";      $tm3 = microtime(true);
      $pos3 = $pos2.' -> ['.$row2[$fnid].']'.$row2[$fnvalue];
      $dir3 = $dir2."/".$row2[$fnid];
      if(!is_dir($dir3) && !mkdir($dir3,0777))
      {
        echo("\n--|--|--|目录创建失败!".$dir3);
        continue;
      }
      $path3 = sprintf('%s/%d.php',$dir3,$row2[$fnid]);
      $data3 = '<'."?php\n";
      $data3.= "\n/* CACHE: {$ID} : {$pos3}\t */";
      $data3.= "\n/* time:  ".date("Y-m-d H:i:s")." */";
      $data3.= "\n/* path:  ".$path3." */\n";
      $data3.= "\n\$CACHE['".$ID."']['".$row1[$fnid]."']['".$row2[$fnid]."'] = array(";
      $dsql->Execute('s3',sprintf($selectSQL,3,$row2[$fnid]));
      while($row3 = $dsql->GetArray('s3'))
      {
        $data3 .= "\n".$row3[$fnid]."\t=>\t'".$row3[$fnvalue]."',";
      }
      $data3.= "\n);\n\n/* [level=3]all taken ".sprintf('%.6f',microtime(true)-$tm3)."s  */\n?".'>';
      $fp3 = fopen($path3,'w');
      fwrite($fp3,$data3);
      fclose($fp3);
    }    $data2.= "\n);\n\n/* [level=2]all taken ".sprintf('%.6f',microtime(true)-$tm2)."s  */\n?".'>';
    $fp2 = fopen($path2,'w');
    fwrite($fp2,$data2);
    fclose($fp2);  }
  $data1.= "\n);\n\n/* [level=1]all taken ".sprintf('%.6f',microtime(true)-$tm1)."s  */\n?".'>';
  $fp1 = fopen($path1,'w');
  fwrite($fp1,$data1);
  fclose($fp1);
  return true;
}生成的内容1:(表diqu)<?php/* CACHE: DIQU : 中国 -> [6]广东 -> [76]广州  */
/* time:  2012-12-21 12:28:42 */
/* path:  D:/website/35***.com/www/data/cacheDiqu/6/76/76.php */$CACHE['DIQU']['6']['76'] = array(
692 => '从化市',
693 => '天河区',
694 => '东山区',
695 => '白云区',
696 => '海珠区',
697 => '荔湾区',
698 => '越秀区',
699 => '黄埔区',
700 => '番禺区',
701 => '花都区',
702 => '增城区',
703 => '从化区',
704 => '市郊',
);/* [level=3]all taken 0.002312s  */
?>
生成的内容2:(表infocat)<?php/* CACHE: INFOCAT : 大分类  */
/* time:  2012-12-21 12:28:43 */
/* path:  D:/website/***.com/www/data/cacheInfocat/0.php */$CACHE['INFOCAT'] = array(
10001 => '照明工业',
10152 => '电子元器件',
10272 => '传媒、广电',
10392 => '安全、防护',
10603 => '包装',
10788 => '纸业',
10897 => '办公、文教',
11183 => '数码、电脑',
11384 => '电工电气',
11694 => '纺织、皮革',
11894 => '服装',
12015 => '服饰',
12069 => '机械及行业设备',
13100 => '五金、工具',
13506 => '化工',
14224 => '精细化学品',
14643 => '橡塑',
14932 => '环保',
15128 => '仪器仪表',
15520 => '家居用品',
15805 => '家用电器',
15967 => '建筑、建材',
16437 => '交通运输',
16597 => '礼品、工艺品、饰品',
16838 => '能源',
16978 => '农业',
17300 => '汽摩及配件',
17636 => '食品、饮料',
17906 => '通信产品',
18034 => '玩具',
18092 => '冶金矿产',
18536 => '印刷',
18712 => '运动、休闲',
18940 => '商务服务',
19177 => '项目合作',
19233 => '二手设备转让',
19278 => '加工',
19455 => '代理',
19512 => '库存积压',
);/* [level=1]all taken 5.697496s  */
?>

解决方案 »

  1.   

    //检测是否正确的代码:
    //检测三级数据,DIQU,INFOCAT
    /*
    1) deep=1,d1=0,d2>0,d3>0
              d1=0,d2=0,d3=0
              d1>0,d2>0,d3=0
              d1>0,d2=0,d3=0
              d1>0,d2>0,d3>0
    2) deep=2,d1>0,d2>0,d3>0
    3) deep=3,d1>0,d2>0,d3>0
    */
    function CheckThree($cacheID='DIQU',$dataArray=array(),$deep=2)
    {
      if(empty($dataArray)) return array(false,'缺少传入的数值参数'); //缺少传入的参数  $cacheArr = array(
      'DIQU'  =>  array('DIQU','/cacheDiqu','/1.php','MakeDiquCache','地区'),
      'INFOCAT' =>  array('DIQU','/cacheInfocat','/0.php','MakeInfocatCache','信息分类'),
      );
      if(!array_key_exists($cacheID,$cacheArr)) return array(false,'ID参数错误!');  list($varName,$cacheDirName,$firstFile,$cacheMakeFuncName,$cnName) = $cacheArr[$cacheID];
      if(!is_dir(DEDEDATA.$cacheDirName)) $cacheMakeFuncName($cacheID);
      list($d1,$d2,$d3) = $dataArray;  $returnData = array();
      if($d1>0)
      {
        $path1 = DEDEDATA.$cacheDirName.$firstFile;
        if(!file_exists($path1)) return array(false,'SysError-'.$cacheID.'-d1 file not found!');
        include $path1;    if(!array_key_exists($d1,$CACHE[$cacheID])) return array(false,'您选择的['.$cnName.']一级属性错误!');
        $returnData[] = $CACHE[$cacheID][$d1];    //防止情况[deep=1,d1>0,d2>0,d3=0],[deep=1,d1>0,d2=0,d3>0]
        if($deep < 2 && !$d2 && !$d3) return array(true,$returnData);
        if($d2>0)
        {
          $path2 = DEDEDATA.$cacheDirName."/{$d1}/{$d1}.php";
          if(!file_exists($path2)) return array(false,'SysError-'.$cacheID.'-d2 file not found!');
          include $path2;      if(!array_key_exists($d2,$CACHE[$cacheID][$d1])) return array(false,'你选择的['.$cnName.']二级属性错误!');
          $returnData[] = $CACHE[$cacheID][$d1][$d2];      //防止情况 [deep=2,d1>0,d2>0,d3>0]导致d3不检查
          if($deep<3 && !$d3) return array(true,$returnData);      if($d3>0)
          {
            $path3 = DEDEDATA.$cacheDirName."/{$d1}/{$d2}/{$d2}.php";
            if(!file_exists($path3)) return array(false,'SysErro-'.$cacheID.'-d3 file not found!');
            include $path3;        if(!array_key_exists($d3,$CACHE[$cacheID][$d1][$d2])) return array(false,'您选择的['.$cnName.']三级属性分类错误!');
            $returnData[] = $CACHE[$cacheID][$d1][$d2][$d3];
            return array(true,$returnData);
          } else {
            return array(false,'您没有选择['.$cnName.']的三级属性');
          }
        } else {
          return array(false,'您没有选择['.$cnName.']的二级属性');
        }
      } else {
        return array(false,'您没有选择['.$cnName.']的一级属性');
      }  //默认也返回数据
      return array(true,$returnData);
    }求点评,代码风格和方式……
      

  2.   

        while($row2 = $dsql->GetArray('s2'))
        {
          $data2 .= "\n".$row2[$fnid]."\t=>\t'".$row2[$fnvalue]."',";
     
          $tm3 = microtime(true);
          $pos3 = $pos2.' -> ['.$row2[$fnid].']'.$row2[$fnvalue];
          $dir3 = $dir2."/".$row2[$fnid];
          if(!is_dir($dir3) && !mkdir($dir3,0777))
          {
            echo("\n--|--|--|目录创建失败!".$dir3);
            continue;
          }
    表示的是如果无法创建目录就跳过,是吧?
    也就是可能什么都缓存不了了?是这个意思吧?
      

  3.   

    1 array_key_exists很直观,但是不如isset效率高
    2 能不用global
      

  4.   

    1 array_key_exists很直观,但是不如isset效率高
    2 能不用global就别用
    3 mkdir别777,你这个是缓存,600就够用了