更改 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