ホームページ >バックエンド開発 >PHPチュートリアル >[コメント募集中] キャッシュを生成するコードの欠点は何だと思いますか?コーディングスタイル

[コメント募集中] キャッシュを生成するコードの欠点は何だと思いますか?コーディングスタイル

WBOY
WBOYオリジナル
2016-06-23 14:06:351009ブラウズ

写了一段生成缓存的函数,大家觉得有什么不足之处?
代码的写的方式和风格方面,求评价

//cacheidfunction 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  */?>







回复讨论(解决方案)

//检测是否正确的代码:

//检测三级数据,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>02) deep=2,d1>0,d2>0,d3>03) 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);}



求点评,代码风格和方式……

    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;
      }
表示的是如果无法创建目录就跳过,是吧?
也就是可能什么都缓存不了了?是这个意思吧?

不错

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

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

while($row2 = $dsql->GetArray('s2'))
    {
      $data2 .= "\n".$row2[$fnid]."\t=>\t'".$row2[$fnvalue]."',";
 
      $tm3 = microtime(true);
      $pos3 = $pos2.' -> ['.$row2[$fn……

逻辑上是这样想的。因为不想一半就停止了。确实比较不太妥,不过有提示

自己的看法就是,现在看这一大段,感觉好臃肿,但是没有更简便的了。。哈哈哈~

自我点评:写的很乱~ ~ 不过貌似没有其他更好的办法了?

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。