A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							161 lines
						
					
					
						
							4.4 KiB
						
					
					
				
			
		
		
	
	
							161 lines
						
					
					
						
							4.4 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of Mustache.php.
 | 
						|
 *
 | 
						|
 * (c) 2010-2017 Justin Hileman
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please view the LICENSE
 | 
						|
 * file that was distributed with this source code.
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Mustache Cache filesystem implementation.
 | 
						|
 *
 | 
						|
 * A FilesystemCache instance caches Mustache Template classes from the filesystem by name:
 | 
						|
 *
 | 
						|
 *     $cache = new Mustache_Cache_FilesystemCache(dirname(__FILE__).'/cache');
 | 
						|
 *     $cache->cache($className, $compiledSource);
 | 
						|
 *
 | 
						|
 * The FilesystemCache benefits from any opcode caching that may be setup in your environment. So do that, k?
 | 
						|
 */
 | 
						|
class Mustache_Cache_FilesystemCache extends Mustache_Cache_AbstractCache
 | 
						|
{
 | 
						|
    private $baseDir;
 | 
						|
    private $fileMode;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Filesystem cache constructor.
 | 
						|
     *
 | 
						|
     * @param string $baseDir  Directory for compiled templates
 | 
						|
     * @param int    $fileMode Override default permissions for cache files. Defaults to using the system-defined umask
 | 
						|
     */
 | 
						|
    public function __construct($baseDir, $fileMode = null)
 | 
						|
    {
 | 
						|
        $this->baseDir = $baseDir;
 | 
						|
        $this->fileMode = $fileMode;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Load the class from cache using `require_once`.
 | 
						|
     *
 | 
						|
     * @param string $key
 | 
						|
     *
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function load($key)
 | 
						|
    {
 | 
						|
        $fileName = $this->getCacheFilename($key);
 | 
						|
        if (!is_file($fileName)) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        require_once $fileName;
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Cache and load the compiled class.
 | 
						|
     *
 | 
						|
     * @param string $key
 | 
						|
     * @param string $value
 | 
						|
     */
 | 
						|
    public function cache($key, $value)
 | 
						|
    {
 | 
						|
        $fileName = $this->getCacheFilename($key);
 | 
						|
 | 
						|
        $this->log(
 | 
						|
            Mustache_Logger::DEBUG,
 | 
						|
            'Writing to template cache: "{fileName}"',
 | 
						|
            array('fileName' => $fileName)
 | 
						|
        );
 | 
						|
 | 
						|
        $this->writeFile($fileName, $value);
 | 
						|
        $this->load($key);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Build the cache filename.
 | 
						|
     * Subclasses should override for custom cache directory structures.
 | 
						|
     *
 | 
						|
     * @param string $name
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected function getCacheFilename($name)
 | 
						|
    {
 | 
						|
        return sprintf('%s/%s.php', $this->baseDir, $name);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create cache directory.
 | 
						|
     *
 | 
						|
     * @throws Mustache_Exception_RuntimeException If unable to create directory
 | 
						|
     *
 | 
						|
     * @param string $fileName
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    private function buildDirectoryForFilename($fileName)
 | 
						|
    {
 | 
						|
        $dirName = dirname($fileName);
 | 
						|
        if (!is_dir($dirName)) {
 | 
						|
            $this->log(
 | 
						|
                Mustache_Logger::INFO,
 | 
						|
                'Creating Mustache template cache directory: "{dirName}"',
 | 
						|
                array('dirName' => $dirName)
 | 
						|
            );
 | 
						|
 | 
						|
            @mkdir($dirName, 0777, true);
 | 
						|
            // @codeCoverageIgnoreStart
 | 
						|
            if (!is_dir($dirName)) {
 | 
						|
                throw new Mustache_Exception_RuntimeException(sprintf('Failed to create cache directory "%s".', $dirName));
 | 
						|
            }
 | 
						|
            // @codeCoverageIgnoreEnd
 | 
						|
        }
 | 
						|
 | 
						|
        return $dirName;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Write cache file.
 | 
						|
     *
 | 
						|
     * @throws Mustache_Exception_RuntimeException If unable to write file
 | 
						|
     *
 | 
						|
     * @param string $fileName
 | 
						|
     * @param string $value
 | 
						|
     */
 | 
						|
    private function writeFile($fileName, $value)
 | 
						|
    {
 | 
						|
        $dirName = $this->buildDirectoryForFilename($fileName);
 | 
						|
 | 
						|
        $this->log(
 | 
						|
            Mustache_Logger::DEBUG,
 | 
						|
            'Caching compiled template to "{fileName}"',
 | 
						|
            array('fileName' => $fileName)
 | 
						|
        );
 | 
						|
 | 
						|
        $tempFile = tempnam($dirName, basename($fileName));
 | 
						|
        if (false !== @file_put_contents($tempFile, $value)) {
 | 
						|
            if (@rename($tempFile, $fileName)) {
 | 
						|
                $mode = isset($this->fileMode) ? $this->fileMode : (0666 & ~umask());
 | 
						|
                @chmod($fileName, $mode);
 | 
						|
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            // @codeCoverageIgnoreStart
 | 
						|
            $this->log(
 | 
						|
                Mustache_Logger::ERROR,
 | 
						|
                'Unable to rename Mustache temp cache file: "{tempName}" -> "{fileName}"',
 | 
						|
                array('tempName' => $tempFile, 'fileName' => $fileName)
 | 
						|
            );
 | 
						|
            // @codeCoverageIgnoreEnd
 | 
						|
        }
 | 
						|
 | 
						|
        // @codeCoverageIgnoreStart
 | 
						|
        throw new Mustache_Exception_RuntimeException(sprintf('Failed to write cache file "%s".', $fileName));
 | 
						|
        // @codeCoverageIgnoreEnd
 | 
						|
    }
 | 
						|
}
 | 
						|
 |