php WordPress缓冲区HTML缓存

xurqigkl  于 2023-01-08  发布在  PHP
关注(0)|答案(1)|浏览(134)

我正在写一个插件,它可以把HTML输出写到文件中,并从那个文件中加载站点。它工作得很完美。但是我不能缓存wp_footer钩子之后的代码。我尝试了wp_footer钩子之后的“shutdown”钩子,但是它返回null。我不知道为什么它返回null。但是我需要一个在wp_footer钩子之后运行的钩子,我可以缓存从0到100的所有代码。

<?php

$priority = 10;
add_action('template_redirect', function(){
    if(!is_admin() && !is_user_logged_in()){

        $cache_time = get_option('html_cache_time');
        if(empty($cache_time)){
            $cache_time = 60;
        }

        $current_url = get_site_url() . $_SERVER['REQUEST_URI'];

        if(filter_var($current_url, FILTER_SANITIZE_URL)){

            $parsed_url = parse_url($current_url);
            $url_path = isset($parsed_url['path']) ? $parsed_url['path'] : false;

            if(!empty($url_path)){

                $cached_url = NGY_CACHE_DIR . 'app/cached/' .  md5($url_path) . '.cache';

                define('NOGAY_CACHED_URL', $cached_url);
                $end_time = 60 * $cache_time;

                if(file_exists($cached_url)){
                    if(time() - $end_time < filemtime($cached_url)){
                        readfile($cached_url);
                        exit;
                    }else{
                        unlink($cached_url);
                    }
                }

            }
        }
        ob_start();
    }

}, $priority);

add_action('wp_footer', function(){
    if(!is_admin() && !is_user_logged_in()){

        $html = ob_get_clean();
        if(!file_exists(NOGAY_CACHED_URL)){
            echo $html;
        }

        $open_cached_file = fopen(NOGAY_CACHED_URL, 'w+');
        fwrite($open_cached_file, $html);
        fclose($open_cached_file);
        ob_end_flush();
    }
}, PHP_INT_MAX);

我尝试了另一个WordPress挂钩。(关机)

06odsfpq

06odsfpq1#

在某些情况下,可能不会调用shutdown钩子,例如由于致命错误而过早终止请求时。
使用send_headers钩子,它在WordPress处理完请求并准备好将响应头发送回用户之后,但在发送响应主体之前被调用。

add_action('send_headers', function(){
    if(!is_admin() && !is_user_logged_in()){
        $html = ob_get_clean();
        if(!file_exists(NOGAY_CACHED_URL)){
            echo $html;
        }

        $open_cached_file = fopen(NOGAY_CACHED_URL, 'w+');
        fwrite($open_cached_file, $html);
        fclose($open_cached_file);
        ob_end_flush();
    }
}, PHP_INT_MAX);

相关问题