Я следил этот урок на функцию кеширования. Я столкнулся с проблемой передачи функции обратного вызова cache_page()
за ob_start
, Как я могу пройти cache_page()
наряду с двумя параметрами $mid
а также $path
в ob_start
что-то вроде
ob_start("cache_page($mid,$path)");
Конечно, вышесказанное не сработает. Вот пример кода:
$mid = $_GET['mid'];
$path = "cacheFile";
define('CACHE_TIME', 12);
function cache_file($p,$m)
{
return "directory/{$p}/{$m}.html";
}
function cache_display($p,$m)
{
$file = cache_file($p,$m);
// check that cache file exists and is not too old
if(!file_exists($file)) return;
if(filemtime($file) < time() - CACHE_TIME * 3600) return;
header('Content-Encoding: gzip');
// if so, display cache file and stop processing
echo gzuncompress(file_get_contents($file));
exit;
}
// write to cache file
function cache_page($content,$p,$m)
{
if(false !== ($f = @fopen(cache_file($p,$m), 'w'))) {
fwrite($f, gzcompress($content));
fclose($f);
}
return $content;
}
cache_display($path,$mid);
ob_start("cache_page"); ///// here's the problem
подпись обратного вызова ob_start
должен быть:
string handler ( string $buffer [, int $phase ] )
Ваш cache_page
Метод имеет несовместимую подпись:
cache_page($content, $p, $m)
Это означает, что вы ожидаете разные аргументы ($p
а также $m
) чем ob_start
перейдем к обратному вызову. Там нет способа сделать ob_start
изменить это поведение. Не отправит $p
а также $m
,
В связанном учебном пособии имя файла кэша получено из запроса, например,
function cache_file()
{
return CACHE_PATH . md5($_SERVER['REQUEST_URI']);
}
Из вашего кода я понимаю, вы хотите определить путь к файлу вручную. Что вы можете сделать, это:
$p = 'cache';
$m = 'foo';
ob_start(function($buffer) use ($p, $m) {
return cache_page($buffer, $p, $m);
});
Это передает совместимый обратный вызов ob_start
который назовет ваш cache_page
функция с выходным буфером и закрывается $p
а также $m
в обратный вызов.
Других решений пока нет …