raw === null && $this->content === null) { $key = md5($this->filename); $file = PhpFile::instance(CACHE_DIR . "compiled/files/{$key}{$this->extension}.php"); $modified = $this->modified(); if (!$modified) { return $this->decode($this->raw()); } $class = get_class($this); $cache = $file->exists() ? $file->content() : null; // Load real file if cache isn't up to date (or is invalid). if ( !isset($cache['@class']) || $cache['@class'] !== $class || $cache['modified'] !== $modified || $cache['filename'] !== $this->filename ) { // Attempt to lock the file for writing. try { $file->lock(false); } catch (\Exception $e) { // Another process has locked the file; we will check this in a bit. } // Decode RAW file into compiled array. $data = (array)$this->decode($this->raw()); $cache = [ '@class' => $class, 'filename' => $this->filename, 'modified' => $modified, 'data' => $data ]; // If compiled file wasn't already locked by another process, save it. if ($file->locked() !== false) { $file->save($cache); $file->unlock(); // Compile cached file into bytecode cache if (function_exists('opcache_invalidate')) { // Silence error if function exists, but is restricted. @opcache_invalidate($file->filename(), true); } } } $file->free(); $this->content = $cache['data']; } } catch (\Exception $e) { throw new \RuntimeException(sprintf('Failed to read %s: %s', basename($this->filename), $e->getMessage()), 500, $e); } return parent::content($var); } /** * Serialize file. */ public function __sleep() { return [ 'filename', 'extension', 'raw', 'content', 'settings' ]; } /** * Unserialize file. */ public function __wakeup() { if (!isset(static::$instances[$this->filename])) { static::$instances[$this->filename] = $this; } } }