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

 
更多

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

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

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

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

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

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

function smarty_core_write_file($params, &$smarty){ 
	$_dirname=dirname($params['filename']); 
	if($params['create_dirs']) { $_params=array('dir'=>$_dirname); 
		require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php'); 
		smarty_core_create_dir_structure($_params, $smarty);
	}
	/**以下代码需要修改**/
	$_tmp_file=tempnam($_dirname, 'wrt');
	if(!($fd=@fopen($_tmp_file, 'wb'))) { 
		$_tmp_file=$_dirname . DIRECTORY_SEPARATOR . uniqid('wrt'); 
		if(!($fd=@fopen($_tmp_file, 'wb'))) { 
			$smarty->trigger_error("problem writing temporary file '$_tmp_file'"); return false;
		}
	} 
	fwrite($fd, $params['contents']);
	fclose($fd);
	if(DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])){
		@unlink($params['filename']); 
		@rename($_tmp_file, $params['filename']);
	}
	@chmod($params['filename'], $smarty->_file_perms);
	return true;
}

新修改成的代码为:

function smarty_core_write_file($params, &$smarty){
	$_dirname=dirname($params['filename']);
	if($params['create_dirs']) {
		$_params=array('dir'=>$_dirname);
		require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
		smarty_core_create_dir_structure($_params, $smarty);
	}
	/**修改为如下代码**/
	$fd=@fopen( $params['filename'], 'wb');
	if(!$fd){
		return false;
	}
	fwrite($fd, $params['contents']);
	fclose($fd);
	@chmod($params['filename'], $smarty->_file_perms);
	return true;
}

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

打赏

本文固定链接: https://www.cxy163.net/archives/4628 | 绝缘体

该日志由 绝缘体.. 于 2013年05月23日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Smarty临时文件创建失败的解决办法 | 绝缘体
关键字: , , , ,

Smarty临时文件创建失败的解决办法:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter