更改Twig缓存文件权限以清除缓存

时间:2019-02-01 08:45:48

标签: php linux caching twig file-permissions

在我正在使用的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中是否有构建方式来清除缓存?

2 个答案:

答案 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