Пример #1
0
function staticCache($file, $line, $key, $callback = null)
{
    if (!isset($callback)) {
        $callback = $key;
        $key = null;
    }
    static $map;
    if (!isset($map)) {
        $map = (object) array();
    }
    if (isset($map->{"{$file}:{$line}-{$key}"})) {
        return $map->{"{$file}:{$line}-{$key}"};
    }
    $cacheFile = $_SERVER['cachePath'] . '/' . substr(pathinfo($file, PATHINFO_FILENAME), 0, 10) . '__' . substr(preg_replace('/(?i)[^a-z0-9]+/', '', $key), 0, 10) . '__' . sha1("{$file}:{$line}-{$key}") . '.cache';
    $cacheCorrelationFile = "{$cacheFile}.correlation";
    if (version_development && is_file($cacheCorrelationFile)) {
        foreach (array_diff(unserialize(file_get_contents($cacheCorrelationFile)), includedFile()) as $file) {
            if (is_file($file)) {
                includedFile($file);
            }
        }
    }
    if (!is_file($cacheFile) || version_development && filemtime($cacheFile) < lastCodeChangeTimestamp()) {
        directory(dirname($cacheFile));
        file_put_contents($cacheFile, serialize($callback()));
        file_put_contents($cacheCorrelationFile, serialize(includedFile()));
    }
    $map->{"{$file}:{$line}-{$key}"} = unserialize(file_get_contents($cacheFile));
    return $map->{"{$file}:{$line}-{$key}"};
}
Пример #2
0
function codeChanged()
{
    static $includedFiles = array();
    static $result = true;
    $newIncludedFiles = includedFile();
    if (count($includedFiles) != count($newIncludedFiles)) {
        $fingerprintFile = $_SERVER['cachePath'] . '/codeBase_' . sha1(serialize($newIncludedFiles)) . '.timestamp';
        $result = !is_file($fingerprintFile) || codeTimestamp() > filemtime($fingerprintFile);
        if ($result) {
            directory(dirname($fingerprintFile));
            $touchResult = touch($fingerprintFile);
            enforce($touchResult, "Could not touch '{$fingerprintFile}'");
        }
        $includedFiles = $newIncludedFiles;
    }
    return $result;
}