Smarty临时文件创建失败的解决办法

Smarty的编译文件是先生成tmp格式的临时文件再重命名回php和ini格式的编译文件的,使用的文件是: internals/core.write_file.php

如果临时文件生成失败,建议按以下步骤查找原因:

(1)检查临时文件目录的权限,是否赋给了写入权限

(2)如果不存在目录权限的问题,则检查当前系统是否禁用了tempnam()函数,以及tempnam()函数的第一个目录参数路径是否完整或存在问题

(3)如果以上问题都不存在,则检查临时文件目录下是否存在后缀名为tmp的文件,如果存在则说明问题应该出在rename函数上,建议参照如下修改:

修改的文件是internals/core.write_file.php 旧的代码是:

  1. function smarty_core_write_file($params, &$smarty){  
  2.     $_dirname=dirname($params['filename']);  
  3.     if($params['create_dirs']) { $_params=array('dir'=>$_dirname);  
  4.         require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');  
  5.         smarty_core_create_dir_structure($_params$smarty); 
  6.     } 
  7.     /**以下代码需要修改**/ 
  8.     $_tmp_file=tempnam($_dirname'wrt'); 
  9.     if(!($fd=@fopen($_tmp_file'wb'))) {  
  10.         $_tmp_file=$_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');  
  11.         if(!($fd=@fopen($_tmp_file'wb'))) {  
  12.             $smarty->trigger_error("problem writing temporary file '$_tmp_file'"); return false; 
  13.         } 
  14.     }  
  15.     fwrite($fd$params['contents']); 
  16.     fclose($fd); 
  17.     if(DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])){ 
  18.         @unlink($params['filename']);  
  19.         @rename($_tmp_file$params['filename']); 
  20.     } 
  21.     @chmod($params['filename'], $smarty->_file_perms); 
  22.     return true; 

新修改成的代码为:

  1. function smarty_core_write_file($params, &$smarty){ 
  2.     $_dirname=dirname($params['filename']); 
  3.     if($params['create_dirs']) { 
  4.         $_params=array('dir'=>$_dirname); 
  5.         require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php'); 
  6.         smarty_core_create_dir_structure($_params$smarty); 
  7.     } 
  8.     /**修改为如下代码**/ 
  9.     $fd=@fopen$params['filename'], 'wb'); 
  10.     if(!$fd){ 
  11.         return false; 
  12.     } 
  13.     fwrite($fd$params['contents']); 
  14.     fclose($fd); 
  15.     @chmod($params['filename'], $smarty->_file_perms); 
  16.     return true; 

做以上修改虽可以解决这个问题,但如代码中注释所述,这个机制是为了解决文件死锁如写冲突一类的问题的,所以这种处理方法会有可能导致生成临时文件的时候出错,但经过本人自己试用,发现还没有出过错,所以大胆的改吧。

转载请注明:代码家园 » Smarty临时文件创建失败的解决办法

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)