Проверка истечения срока действия заголовков PHP - PullRequest
1 голос
/ 12 марта 2012

Я создаю пользовательское приложение и мне нравится передавать некоторые переменные PHP в CSS.

Используемый мной подход - это файл style.php, который обслуживает заголовки CSS, поэтому HTTP-запрос направляет запрос.как обычный файл CSS.

Проблема этого подхода заключается в том, что при каждом запросе мне приходится загружать в память несколько больших файлов PHP.

Что мне нравится делать, так это проверять срок действиядата файла и, если срок действия файла еще не истек, не запускайте сценарий и вместо этого отправляйте кэшированный файл.

Итак, есть ли решение для этой проблемы?

MyPHP-файл, который мне нравится, выглядит примерно так:

<?php
    // Enter here several headers to cache the file and other operations
    // Check here if the file must be re-executed or load a cached version instead
    // Enter here the inclution of my application scripts with include_once(....)
?>
body
{
    background-color: <?php echo $options->css['bg_color']; ?>
}

С уважением, Мерианос Никос

1 Ответ

1 голос
/ 12 марта 2012

Мне пришлось сделать что-то похожее на то, что вы делаете, и решил проблему с парсингом файловой стороны CSS-сервера. Вот ссылка на простой класс, который делает именно это (это то, что я сейчас использую). В основном он анализирует все файлы в каталоге и использует strtr () для замены значений в файле css

class Css {
    //this is an associative array that's used when replacing
    private $settings;
    //This is the path (relative to this file) to the dir that holds the css files to parse
    private $cssDir = "css/";
    //private varray to store the files
    private $cssFiles = array();
    //This is the path (relative to this file) to the dir where the parsed css files wil be written
    private $outCssDir = "../css/";

    /**
     * the class thake only one parameters, an associative array of keys to replace with their respective values
     */
    function __construct($settings) {
        $this -> settings = $settings;
        $this -> readFiles();
        $this -> replaceValuesInCssStrings();

    }

    private function readFiles() {
        $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . $this -> cssDir;
        if (file_exists($dir)) {
            if ($handle = opendir($dir)) {
                /* This is the correct way to loop over the directory. */
                while (false !== ($entry = readdir($handle))) {
                    //filter out .. and .
                    if ($entry !== "." && $entry !== "..") {
                        $cssFiles[$entry] = file_get_contents($dir . $entry);
                    }
                }

                closedir($handle);
            }
        }
        $this -> cssFiles = $cssFiles;

    }

    private function replaceValuesInCssStrings() {
        foreach ($this->cssFiles as $fileName => $fileContent) {
            $this->cssFiles[$fileName] = strtr($fileContent, $this-> settings);

        }
    }
    /**
     * renders the parsed css files in a <style> tag
     */
    public function render() {
        $css = "<style>\n";
        foreach ($this -> cssFiles as $fileContent) {
            $css .= $fileContent;
        }
        $css .= "</style>";
        echo($css);
    }

    /**
     * writes the parsed css files to the $outCssDir (keeping their names intact)
     */
    public function renderToFile() {
        $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . $this -> outCssDir;
        if (file_exists($dir)) {
            foreach($this->cssFiles as $fileName => $fileContent){
                file_put_contents($dir . $fileName, $fileContent);

            }   
        }
    }
    /**
     *  this is just in case you want to call echo ($css)
     */
    public function __toString() {
        $this -> render();
    }

}
...