更改 Twig 缓存文件权限以清除缓存
Change Twig cache file permissions to clear cache
在我正在使用的网络服务器上,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 权限编写 dirs/files?
或者,在 Twig 中是否有内置方式来清除缓存?
不,没有清除缓存的内置方法,但我没有更改 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
作为文件权限被认为是安全线程,不推荐使用
这不是我最初想的解决问题的方法,但它确实有效。
我向我的 rc.local 添加了一个脚本,该脚本使用 inotifywait 检查我的 twig 模板文件夹中是否发生了任何新文件或现有文件的更改。如果为真,缓存将被清除。
我为 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
在我正在使用的网络服务器上,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 权限编写 dirs/files? 或者,在 Twig 中是否有内置方式来清除缓存?
不,没有清除缓存的内置方法,但我没有更改 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
作为文件权限被认为是安全线程,不推荐使用
这不是我最初想的解决问题的方法,但它确实有效。 我向我的 rc.local 添加了一个脚本,该脚本使用 inotifywait 检查我的 twig 模板文件夹中是否发生了任何新文件或现有文件的更改。如果为真,缓存将被清除。 我为 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