Как передать функцию обратного вызова с параметрами для ob_start в PHP?

Я следил этот урок на функцию кеширования. Я столкнулся с проблемой передачи функции обратного вызова 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

4

Решение

подпись обратного вызова 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 в обратный вызов.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]