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.
		
		
		
		
			
				
					162 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					162 lines
				
				4.4 KiB
			| 
								 
											7 years ago
										 
									 | 
							
								<?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
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |