Измените разрешения для файла кеша Twig, чтобы очистить кеш - PullRequest
0 голосов
/ 01 февраля 2019

На веб-сервере, над которым я работаю, 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 незапись dirs / файлов с разрешениями 777?В качестве альтернативы есть ли в Twig сборка для очистки кэша?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я изначально не думал, что решил проблему, но это работает.Я добавил скрипт в свой 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
0 голосов
/ 01 февраля 2019

Нет, встроенного способа очистки кэша нет, но вместо изменения основного файла ветки у меня есть другое решение этой проблемы.Просто создайте свой собственный 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 в качестве прав доступа к файлу считается потоком безопасности и не рекомендуется

...