3 * Smarty write file plugin
6 * @subpackage PluginsInternal
11 * Smarty Internal Write File Class
14 * @subpackage PluginsInternal
16 class Smarty_Internal_Write_File
19 * Writes file in a safe way to disk
21 * @param string $_filepath complete filepath
22 * @param string $_contents file content
23 * @param Smarty $smarty smarty instance
25 * @throws SmartyException
26 * @return boolean true
28 public static function writeFile($_filepath, $_contents, Smarty $smarty)
30 $_error_reporting = error_reporting();
31 error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING);
32 if ($smarty->_file_perms !== null) {
33 $old_umask = umask(0);
36 $_dirpath = dirname($_filepath);
37 // if subdirs, create dir structure
38 if ($_dirpath !== '.' && !file_exists($_dirpath)) {
39 mkdir($_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true);
42 // write to tmp file, then move to overt file lock race condition
43 $_tmp_file = $_dirpath . DS . str_replace(array('.', ','), '_', uniqid('wrt', true));
44 if (!file_put_contents($_tmp_file, $_contents)) {
45 error_reporting($_error_reporting);
46 throw new SmartyException("unable to write file {$_tmp_file}");
50 * Windows' rename() fails if the destination exists,
51 * Linux' rename() properly handles the overwrite.
52 * Simply unlink()ing a file might cause other processes
53 * currently reading that file to fail, but linux' rename()
54 * seems to be smart enough to handle that for us.
56 if (Smarty::$_IS_WINDOWS) {
57 // remove original file
60 $success = @rename($_tmp_file, $_filepath);
63 $success = @rename($_tmp_file, $_filepath);
65 // remove original file
68 $success = @rename($_tmp_file, $_filepath);
73 error_reporting($_error_reporting);
74 throw new SmartyException("unable to write file {$_filepath}");
77 if ($smarty->_file_perms !== null) {
78 // set file permissions
79 chmod($_filepath, $smarty->_file_perms);
82 error_reporting($_error_reporting);