在我正在使用的Web服务器上,Twig 1.27使用Apache用户和755权限创建缓存文件。
$ ls -la cache/
total 4
drwxrwxrwx 5 apache apache 33 Jan 31 09:40 .
drwxrwxrwx 5 apache apache 4096 Jan 31 02:39 ..
drwxr-xr-x 2 apache apache 81 Jan 31 09:40 08
drwxr-xr-x 2 apache apache 81 Jan 31 09:40 4e
drwxr-xr-x 2 apache apache 81 Jan 31 09:40 92
我想清除缓存而不通过脚本获取su权限。因此,我查看了Twig文件,发现它实际上已设置为以777权限写入它们。
lib / Twig / Cache / Filesystem.php
public function write($key, $content)
{
$dir = dirname($key);
if (!is_dir($dir)) {
if (false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
为什么Apache不使用777权限编写目录/文件? 另外,Twig中是否有构建方式来清除缓存?
答案 0 :(得分:1)
不存在清除缓存的内置方法,但是除了更改twig的核心文件外,我没有其他解决方案。只需创建自己的Environment
(扩展为Twig_Environment
,然后调整writeCacheFile
函数并为自定义实例创建一个实例即可,而不是默认的Twig_Environment
。
class Environment extends \Twig_Environment {
protected function writeCacheFile($file, $content){
$this->createDirectoryTree(dirname($file));
parent::writeCacheFile($file, $content);
chmod($file,0664);
}
protected function createDirectoryTree($folder) {
if (is_dir($folder)) return;
$folder = str_replace('/', DIRECTORY_SEPARATOR, $folder);
$branches = array_filter(explode(DIRECTORY_SEPARATOR, $folder));
$tree = DIRECTORY_SEPARATOR;
if (strpos($folder, 'httpdocs') !== false) while(!empty($branches) && strpos($tree, 'httpdocs') === false) $tree .= array_shift($branches).DIRECTORY_SEPARATOR;
while(is_dir($tree)) $tree .= array_shift($branches).DIRECTORY_SEPARATOR;
array_unshift($branches, pathinfo($tree, PATHINFO_FILENAME));
$tree = realpath(dirname($tree)).DIRECTORY_SEPARATOR;
if ($tree === null) return;
$old_mask = umask(0);
while(!empty($branches)) {
$tree .= array_shift($branches).DIRECTORY_SEPARATOR;
if (!@file_exists($tree)) @mkdir($tree, 0775);
}
umask($old_mask);
}
}
注意:使用0777
作为文件权限被视为安全线程,不建议使用
答案 1 :(得分:0)
这不是我最初想解决问题的方法,但是它可以工作。 我在rc.local中添加了一个脚本,该脚本使用 inotifywait 检查在树枝模板文件夹中是否发生了任何新文件或现有文件的更改。如果为true,则将清除缓存。 我添加了vi交换文件的排除项,以便在打开文件时不会触发脚本。
#!/bin/bash
while true
do
inotifywait -e modify -r /var/www/project/tpl/ @/var/www/project/tpl/cache --excludei ".swp"
rm -rf /var/www/project/tpl/cache/*
done