今天接到主管一个任务,一直以来在IIS服务器上,系统是server 2003的,ecshop的网站经常会出Notice: Undefined variable: data in XXX line  xxx,failed to open stream: No such file or directory :.......Warning: require(../../languages//common.php),Fatal error: require():.......尤其是有这样的标志:/languages//common.php..注意前面的两个/,这表明没有写入,刚开始公司里一直用的是网上的办法,删除根目录下的“temp/static_caches/ ” 里面的文件,保留index.htm,而且我们的人也把temp文件夹的权限改成777,但是好景不长,隔一段时间之后,当temp文件夹下的文件到达一定程度后,当然我也不知道这个程度是以什么为标准的。文件夹的权限被自动恢复,又出现如上的错误还得手工去改它,于是主管下定决心要把这个问题从根本上解决掉。

   经过一个上午的查询资料,我发现了别人忽略的一个地方,在includes文件下有一个叫lib_base.php的文件,里面存着这样的两个函数

函数一:

read_static_cache()
  1. /** 
  2.  * 读结果缓存文件 
  3.  * 
  4.  * @params  string  $cache_name 
  5.  * 
  6.  * @return  array   $data 
  7.  */ 
  8. function read_static_cache($cache_name
  9.     if ((DEBUG_MODE & 2) == 2) 
  10.     { 
  11.         return false; 
  12.     } 
  13.     static $result = array(); 
  14.     if (!emptyempty($result[$cache_name])) 
  15.     { 
  16.         return $result[$cache_name]; 
  17.     } 
  18.     $cache_file_path = ROOT_PATH . '/temp/static_caches/' . $cache_name . '.php'
  19.     if (file_exists($cache_file_path)) 
  20.     { 
  21.         include_once($cache_file_path); 
  22.         $result[$cache_name] = $data
  23.         return $result[$cache_name]; 
  24.     } 
  25.     else 
  26.     { 
  27.         return false; 
  28.     } 

另一个函数

write_static_cache()
  1. /** 
  2.  * 写结果缓存文件 
  3.  * 
  4.  * @params  string  $cache_name 
  5.  * @params  string  $caches 
  6.  * 
  7.  * @return 
  8.  */ 
  9. function write_static_cache($cache_name$caches
  10.     if ((DEBUG_MODE & 2) == 2) 
  11.     { 
  12.         return false; 
  13.     } 
  14.     $cache_file_path = ROOT_PATH . '/temp/static_caches/' . $cache_name . '.php'
  15.     $content = "<?php\r\n"
  16.     $content .= "\$data = " . var_export($caches, true) . ";\r\n"
  17.     $content .= "?>"
  18.     file_put_contents($cache_file_path$content, LOCK_EX); 

这两个函数就是控制读出和写入缓存的,在各个页面中都有被用到。而从上面的错误信息分析来看,只有不让它写入到temp文件夹下就能解决问题,也就是缓存的屏蔽,将这两个函数,在第一个 if  前面加上

  1. return false; 

直接屏蔽掉功能,这样改过之后,(测试之前应该删除原有的除index.htm以外的文件,然后通过反复访问进行测试缓存的写入)我测试了一下,temp/static_caches/文件夹下不再写入缓存文件了,只保留有index.htm,也就是不会再出现刚开始的那种错误了,因为写入和读出都被屏蔽了。最直接是页面的错误消失了,网站恢复了正常,让人感到欣慰。

缓存的屏蔽,网上通用都是那个cls_template.php文件下的两行代码的注释,

  1. if (file_put_contents($this->cache_dir . ‘/’ . $cachename . ‘.php’, ‘<?php exit;?>’ . $data . $out) === false) 
  2.        { 
  3.            trigger_error(’can\’t write:’ . $this->cache_dir . ‘/’ . $cachename . ‘.php’); 
  4.        } 

我试过了,没效果。。。也许别人有效吧,欢迎一起探讨。 详细内容可来我的博客一起探讨 没有船的海贼  www.hanluner.com