source: trunk/include/smarty/libs/sysplugins/smarty_internal_write_file.php @ 23384

Last change on this file since 23384 was 23384, checked in by rvelices, 11 years ago

smarty 3 - first pass for tests

File size: 2.6 KB
Line 
1<?php
2/**
3 * Smarty write file plugin
4 *
5 * @package Smarty
6 * @subpackage PluginsInternal
7 * @author Monte Ohrt
8 */
9
10/**
11 * Smarty Internal Write File Class
12 *
13 * @package Smarty
14 * @subpackage PluginsInternal
15 */
16class Smarty_Internal_Write_File {
17
18    /**
19     * Writes file in a safe way to disk
20     *
21     * @param string $_filepath complete filepath
22     * @param string $_contents file content
23     * @param Smarty $smarty    smarty instance
24     * @return boolean true
25     */
26    public static function writeFile($_filepath, $_contents, Smarty $smarty)
27    {
28        $_error_reporting = error_reporting();
29        error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING);
30        if ($smarty->_file_perms !== null) {
31            $old_umask = umask(0);
32        }
33
34        $_dirpath = dirname($_filepath);
35        // if subdirs, create dir structure
36        if ($_dirpath !== '.' && !file_exists($_dirpath)) {
37            mkdir($_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true);
38        }
39
40        // write to tmp file, then move to overt file lock race condition
41        $_tmp_file = $_dirpath . DS . uniqid('wrt', true);
42        if (!file_put_contents($_tmp_file, $_contents)) {
43            error_reporting($_error_reporting);
44            throw new SmartyException("unable to write file {$_tmp_file}");
45            return false;
46        }
47       
48        /*
49         * Windows' rename() fails if the destination exists,
50         * Linux' rename() properly handles the overwrite.
51         * Simply unlink()ing a file might cause other processes
52         * currently reading that file to fail, but linux' rename()
53         * seems to be smart enough to handle that for us.
54         */
55        if (Smarty::$_IS_WINDOWS) {
56            // remove original file
57            @unlink($_filepath);
58            // rename tmp file
59            $success = @rename($_tmp_file, $_filepath);
60        } else {
61            // rename tmp file
62            $success = @rename($_tmp_file, $_filepath);
63            if (!$success) {
64                // remove original file
65                @unlink($_filepath);
66                // rename tmp file
67                $success = @rename($_tmp_file, $_filepath);
68            }
69        }
70
71        if (!$success) {
72            error_reporting($_error_reporting);
73            throw new SmartyException("unable to write file {$_filepath}");
74            return false;
75        }
76
77        if ($smarty->_file_perms !== null) {
78            // set file permissions
79            chmod($_filepath, $smarty->_file_perms);
80            umask($old_umask);
81        }
82        error_reporting($_error_reporting);
83        return true;
84    }
85
86}
87
88?>
Note: See TracBrowser for help on using the repository browser.