при загрузке этого примера веб-страницы он проверяет кэшированный файл из папки / cache. Если нет кэшированного файла, он вызывает ob_start () и создает файл кэша .html. Проблема в том, что этот процесс кэширования работает каждый раз, даже когда я не вызывал ob_start (). Пожалуйста, посоветуй мне. Спасибо.
// class file
function check_cache($dynamic_url) {
$cache_file = $this->cache_folder.md5($dynamic_url).$this->cache_ext;
if ((file_exists($cache_file)) && (time() - $this->cache_time < filemtime($cache_file))) {
// ob_start('ob_gzhandler');
readfile($cache_file);
ob_end_flush();
exit();
}
else {
//ob_start('ob_gzhandler');
}
}
function create_cache($dynamic_url) {
$cache_file = $this->cache_folder.md5($dynamic_url).$this->cache_ext;
$fp = fopen($cache_file, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
}
и я называю этот класс из
$cache->check_cache(get_full_url());
<h1>Today is <?php echo date('Y-m-d h:i:s'); ?></h1>
$cache->create_cache(get_full_url());
Я думаю, что ваш кэш все еще создается из-за того, что ваш create_cache вызывает fopen, независимо от того, запущен ли выходной буфер или нет. Поэтому перед проверкой fopen следует проверить состояние выходного буфера следующим образом:
function create_cache($dynamic_url) {
if (ob_get_level() > 0) {
$cache_file = $this->cache_folder.md5($dynamic_url).$this->cache_ext;
$fp = fopen($cache_file, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
}
}
Вы можете использовать ob_get_level или ob_get_status: http://php.net/manual/en/function.ob-get-status.php
Других решений пока нет …