process_migration();
add_filter('berqwp_ignored_urls_params', [$this, 'ingore_tracking_params']);
add_action('template_redirect', [$this, 'queue_page'], 11);
if (!isset($_GET['bwp_preload'])) {
add_action('wp', [$this, 'html_cache'], 2);
}
// Clear page cache on update
add_action('save_post', [$this, 'clear_cache_on_post_update'], 10, 3);
// // Automatic cache warmup
// // add_action('init', [$this, 'warmup_home']);
// add_action('berqwp_flush_all_cache', [$this, 'warmup_home']);
// add_action('warmup_cache_quickly', 'warmup_cache_by_url');
// add_action('bwp_warmup_sitemap', [$this, 'warmup_sitemap']);
// add_action('berqwp_flush_all_cache', [$this, 'request_warmup_cache']);
// add_action('berqwp_cache_warmup', [$this, 'request_warmup_cache']);
// Delete cache files when the mode changes
// add_action('berqwp_before_update_optimization_mode', [$this, 'delete_cache_files']);
add_action('berqwp_on_update_optimization_mode', [$this, 'delete_cache_files']);
// Reverse proxy cache support
add_action('berqwp_stored_page_cache', [$this, 'flush_reverse_proxy_cache']);
add_action('berqwp_flush_all_cache', ['berqReverseProxyCache', 'flush_all']);
add_action('berqwp_flush_page_cache', [$this, 'flush_reverse_proxy_cache']);
// Clear cache warmup lock after storing the cache
add_action('berqwp_stored_page_cache', 'bwp_clear_warmup_lock');
// Log recently optimized pages
add_action('berqwp_stored_page_cache', 'bwp_log_recently_optimized_page', 20, 1);
add_action('berqwp_flush_all_cache', 'bwp_clear_recently_optimized_log');
add_action('berqwp_flush_page_cache', 'bwp_remove_recently_optimized_entry', 10, 1);
add_action('init', [$this, 'bypass_cache']);
// add_action('init', [$this, 'bypass_cache']);
// Flush cache when there's a new comment
add_action('wp_set_comment_status', [$this, 'handle_new_comment'], 10, 2);
// Store cache without any need for the rest api
add_action('init', 'bwp_webhook');
// Handle request new cache request
add_action('init', 'bwp_handle_request_cache');
// Flush cache when theme changes
add_action('switch_theme', [$this, 'delete_cache_files']);
// Flush critical css when theme changes
add_action('switch_theme', [$this, 'purge_critical_css_cache']);
// Flush critical css when custimizer additional css is updated
add_action('customize_save_css', [$this, 'purge_critical_css_cache']);
// Request cache when a post is published
// clear_cache_on_post_update and handle_post_status_update almost do the same thing
// add_action( 'transition_post_status', [$this, 'handle_post_status_update'], 10, 3 );
add_action('send_headers', [$this, 'brust_cache_for_loggedin']);
// Purge home page when new post is published
add_action('transition_post_status', [$this, 'purge_home'], 10, 3);
// flush cloudflare edge cache
add_action('berqwp_stored_page_cache', [$this, 'flush_cf_page']);
add_action('berqwp_flush_page_cache', [$this, 'flush_cf_page']);
add_action('berqwp_flush_all_cache', 'bwp_cf_flush_all');
add_action('berqwp_on_update_sandbox_mode', 'bwp_cf_flush_all');
add_action('berqwp_deactivate_plugin', 'bwp_cf_delete_rules');
add_action('berqwp_activate_plugin', [$this, 'check_cf_rules']);
// Apache htaccess cache rules (skip on LiteSpeed — remove any existing rules)
add_action('berqwp_activate_plugin', 'bwp_write_htaccess_rules');
add_action('berqwp_flush_all_cache', 'bwp_write_htaccess_rules');
add_action('berqwp_deactivate_plugin', 'bwp_remove_htaccess_rules');
if (bwp_is_openlitespeed_server()) {
add_action('berqwp_activate_plugin', 'bwp_remove_htaccess_rules');
}
add_action('berqwp_on_update_sandbox_mode', 'bwp_sync_htaccess_on_sandbox_change');
// Clear queue list on cloud
add_action('berqwp_deactivate_plugin', 'berqwp_clear_cache_queue');
// Edit post type list custom links
$bwp_post_types = get_option('berqwp_optimize_post_types');
if (is_admin() && !empty($bwp_post_types)) {
foreach ($bwp_post_types as $post_type) {
add_filter("{$post_type}_row_actions", [$this, 'post_type_action_links'], 10, 2);
}
}
// detect when theme/plugin is installed or updated
add_action( 'upgrader_process_complete', [$this, 'process_updates'], 10, 2 );
// handle menu update
add_action( 'wp_update_nav_menu', [$this, 'handle_menu_update'], 10, 2 );
// handle customizer save
add_action( 'customize_save', [$this, 'handle_customizer_update'] );
}
static function getInstance() {
if (self::$instance === null) {
$instance = new berqCache();
self::$instance = $instance;
return $instance;
}
return self::$instance;
}
function handle_customizer_update( $wp_customize ) {
global $berq_log;
$berq_log->info("Customizer updated");
$this->flush_all();
}
function handle_menu_update( $menu_id, $menu_data = null ) {
global $berq_log;
$berq_log->info("Site menu updated");
$this->flush_all();
}
function flush_all() {
global $berq_log;
$berq_log->info("Flushing everything");
if (berqwp_can_use_cloud()) {
// flush critical css
$this->purge_critical_css_cache();
// stale cdn
self::stale_cloud_assets();
}
// clear cache
$this->delete_cache_files();
}
function process_updates( WP_Upgrader $upgrader, array $hook_extra ) {
if (!berqwp_can_use_cloud()) {
return;
}
global $berq_log;
$berq_log->info("Processing updates");
self::stale_cloud_assets();
$this->purge_critical_css_cache();
}
static function stale_cloud_assets() {
if (!berqwp_can_use_cloud()) {
return;
}
global $berq_log;
$berq_log->info("Marking cloud assets stale");
$berqwp = new BerqWP(berqwp_get_license_key(), null, null);
$parsed_url = wp_parse_url(home_url());
$domain = $parsed_url['host'];
// mark cdn assets stale
$berqwp->cdn_stale_assets($domain);
// flush all critical css cache
$berqwp->purge_critilclcss($domain);
}
function process_migration() {
$raw_home = get_option('home');
if (defined('WP_HOME')) {
$raw_home = WP_HOME;
}
// detect migration when home changes
if (get_option('berqwp_raw_home', $raw_home) !== $raw_home) {
global $berq_log;
$berq_log->info('Raw home url change detected, flushing all cache');
if (get_option('berqwp_raw_home', $raw_home) !== null) {
$berq_log->info('Home url change detected, flushing all cache');
}
// regenerate site id
$berqconfigs = berqConfigs::getInstance();
$blog_id = get_current_blog_id();
$network_id = function_exists('get_current_network_id') ? get_current_network_id() : 1;
$siteurl = get_option('siteurl');
$site_id = md5("berqwp|$network_id|$blog_id|$siteurl");
$berqconfigs->update_configs(['site_id' => $site_id, 'secret' => '']);
// Flush critical css
$parsed_url = wp_parse_url(home_url());
$domain = $parsed_url['host'];
$berqwp = new BerqWP(berqwp_get_license_key(), null, null);
$berqwp->purge_critilclcss($domain);
// Flush page cache
$this->delete_cache_files();
update_option('berqwp_raw_home', $raw_home);
delete_transient('berq_lic_response_cache');
delete_transient('berqwp_lic_response_cache');
}
}
function post_type_action_links($actions, $post)
{
$page_url = get_permalink($post->ID);
$url = wp_nonce_url(admin_url('admin-post.php?action=berq_purge_page&uri=' . urlencode($page_url)), 'berq_purge_page_action');
$actions['berqwp_flush_cache'] = 'Flush Cache';
$url = wp_nonce_url(admin_url('admin-post.php?action=berq_request_cache&uri=' . urlencode($page_url)), 'berq_request_cache_action');
$actions['berqwp_force_cache'] = 'Force Cache';
return $actions;
}
function check_cf_rules()
{
if (!empty(get_option('berqwp_cf_creden'))) {
$email = get_option('berqwp_cf_creden')['email'];
$apitoken = get_option('berqwp_cf_creden')['apitoken'];
$zoneid = get_option('berqwp_cf_creden')['zoneid'];
$berqCloudflareAPIHandler = new berqCloudflareAPIHandler($email, $apitoken, $zoneid);
if ($berqCloudflareAPIHandler->verify_credentials()) {
$berqCloudflareAPIHandler->add_rule();
$berqCloudflareAPIHandler->purge_all_cache();
return;
}
delete_option('berqwp_cf_creden');
}
}
function flush_author_cache($post_id)
{
// Bail out on autosaves and revisions
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
return;
if (wp_is_post_revision($post_id))
return;
$post = get_post($post_id);
if (!$post)
return;
global $berq_log;
// Get current author ID
$current_author_id = $post->post_author;
// Get original author ID before any potential changes
$original_post = wp_get_post_revision($post_id);
$original_author_id = $original_post ? $original_post->post_author : $current_author_id;
// Collect all author IDs that need flushing
$author_ids = array_unique([$current_author_id, $original_author_id]);
foreach ($author_ids as $author_id) {
// Skip invalid author IDs
if (!$author_id || !get_userdata($author_id))
continue;
// Get author archive URL
$author_link = get_author_posts_url($author_id);
if (!is_wp_error($author_link) && !empty($author_link)) {
$berq_log->info("Purging author cache: $author_link");
self::purge_page($author_link);
// Handle translations for multilingual author archives
$translation_urls = apply_filters('berqwp_page_translation_urls', [], $author_link);
if (!empty($translation_urls)) {
foreach ($translation_urls as $url) {
$berq_log->info("Purging author translation cache: $url");
self::purge_page($url);
}
}
}
}
}
function flush_post_taxonomy_cache($post_id)
{
// Bail out on autosaves and revisions.
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (wp_is_post_revision($post_id)) {
return;
}
$post = get_post($post_id);
if (!$post) {
return;
}
global $berq_log;
// Get all taxonomies registered for this post type.
$taxonomies = get_object_taxonomies($post->post_type);
if (!empty($taxonomies)) {
// Clear the object term cache for the post.
clean_object_term_cache($post_id, $taxonomies);
// Loop through each taxonomy.
foreach ($taxonomies as $taxonomy) {
if (!in_array($taxonomy, get_option('berqwp_optimize_taxonomies'))) {
continue;
}
// Get all terms for this post in the current taxonomy.
$terms = get_the_terms($post_id, $taxonomy);
if (empty($terms) || is_wp_error($terms)) {
continue;
}
foreach ($terms as $term) {
// Clear the term cache for the original term.
clean_object_term_cache($term->term_id, $taxonomy);
// Collect terms to purge: original term and its ancestors (if hierarchical)
$terms_to_purge = array($term);
// Check if taxonomy is hierarchical to process ancestors
if (is_taxonomy_hierarchical($taxonomy)) {
$ancestor_ids = get_ancestors($term->term_id, $taxonomy, 'taxonomy');
foreach ($ancestor_ids as $ancestor_id) {
$ancestor_term = get_term($ancestor_id, $taxonomy);
if ($ancestor_term && !is_wp_error($ancestor_term)) {
$terms_to_purge[] = $ancestor_term;
}
}
}
// Process each term (original and ancestors)
foreach ($terms_to_purge as $term_to_purge) {
$term_link = get_term_link($term_to_purge);
if (is_wp_error($term_link)) {
continue;
}
$berq_log->info("Purging cache for term $term_link");
self::purge_page($term_link);
// Handle translations
$translation_urls = apply_filters('berqwp_page_translation_urls', array(), $term_link);
if (!empty($translation_urls)) {
foreach ($translation_urls as $url) {
$berq_log->info("Purging taxonomy translation for $url");
self::purge_page($url);
}
}
}
}
}
}
}
function purge_critical_css_cache()
{
$parsed_url = wp_parse_url(home_url());
$domain = $parsed_url['host'];
$berqwp = new BerqWP(berqwp_get_license_key(), null, null);
$berqwp->purge_critilclcss($domain);
}
function flush_cf_page($slug = '')
{
if (empty($slug)) {
$slug = '/';
}
$url = home_url($slug);
bwp_cf_flush_page($url);
}
function purge_home($new_status, $old_status, $post)
{
$can_flush_cache = apply_filters('berqwp_can_flush_home_cache_on_post_update', true);
if (!$can_flush_cache) {
return;
}
if ($new_status == 'draft' && $old_status == 'draft') {
return;
}
if ($new_status == 'auto-draft') {
return;
}
if ($new_status == 'trash') {
return;
}
if ($new_status == 'publish' && $old_status == 'publish') {
return;
}
// if ($old_status == 'new' && $new_status == 'draft') {
// return;
// }
// if statement skips when scheduled post publishes
// with admin wp cron request
// if (!is_admin()) {
// $berq_log->info('Trasition post status admin' . ' ' . $new_status);
// return;
// }
$post_types = apply_filters('berqwp_purge_home_post_types', ['post']);
if (in_array($post->post_type, $post_types)) {
global $berq_log;
$berq_log->info('Purging homepage. Triggered by post type: ' . $post->post_type . ' ' . $old_status . ' ' . $new_status);
$home_url = home_url('/');
self::purge_page($home_url);
warmup_cache_by_url($home_url, true);
}
$blog_page_id = get_option('page_for_posts');
if ($blog_page_id) {
$blog_url = get_permalink($blog_page_id);
global $berq_log;
$berq_log->info('Purging blog page: ' . $blog_url);
self::purge_page($blog_url);
warmup_cache_by_url($blog_url);
}
}
function brust_cache_for_loggedin()
{
if (is_user_logged_in()) {
// Add Vary: Cookie header to differentiate cached versions for logged-in users
header('Vary: Accept-Encoding, Cookie');
// header("Cache-Control: no-cache, no-store, must-revalidate");
// header("Pragma: no-cache");
// header("Expires: 0");
}
}
function handle_post_status_update($new_status, $old_status, $post)
{
// Get the post types that should be optimized from BerqWP settings
$post_types = get_option('berqwp_optimize_post_types');
// Get the published post URL
$post_url = get_permalink($post);
// Only proceed if the post is being published (from any status to 'publish')
if ('publish' === $new_status && 'publish' !== $old_status) {
// Check if the post type is in the list of types to be optimized
if (in_array($post->post_type, $post_types)) {
// We need path with query parameters
$parsed_url = parse_url($post_url);
$path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
$query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
$path_with_query = $path . $query;
if (berqwp_is_slug_excludable($path_with_query)) {
return;
}
global $berq_log;
$berq_log->info("Post status updated $post_url");
if (bwp_can_optimize_page_url($post_url)) {
warmup_cache_by_url($post_url);
}
self::purge_page($post_url, true);
$this->flush_post_taxonomy_cache($post->ID);
$this->flush_author_cache($post->ID);
}
}
}
public static function delete_page_cache_files($page_url)
{
$cache_file = bwp_get_cache_dir() . bwp_build_cache_path($page_url) . '/index.html.gz';
if (file_exists($cache_file)) {
unlink($cache_file);
}
}
public static function purge_page($page_url, $flush_criticalcss = false)
{
if (!berqwp_can_use_cloud()) {
$flush_criticalcss = false;
}
$page_url = strtolower($page_url);
// $page_path = bwp_intersect_str(home_url(), $page_path);
$slug = bwp_url_into_path($page_url);
self::delete_page_cache_files($page_url);
do_action('berqwp_flush_page_cache', $slug);
if ($flush_criticalcss) {
$berqwp = new BerqWP(berqwp_get_license_key(), null, null);
$berqwp->purge_criticlecss_url($page_url);
}
bwp_cf_flush_page(home_url($slug));
}
function handle_new_comment($comment_id, $comment_status)
{
if ($comment_status === 'approve') {
$comment = get_comment($comment_id);
$post_id = $comment->comment_post_ID;
$post_url = get_permalink($post_id);
self::purge_page($post_url);
global $berq_log;
$berq_log->info("New comment added, deleting cache for $post_url");
}
}
function bypass_cache()
{
if (
isset($_GET['nocache'])
|| isset($_GET['bwp_preload'])
// || isset($_GET['creating_cache'])
|| berqDetectCrawler::is_crawler() ||
(get_option('berqwp_enable_sandbox') == 1 && !isset($_GET['berqwp']) && !is_admin() && !isset($_POST))
) {
add_filter('berqwp_bypass_cache', function () {
return true;
});
// if (berqReverseProxyCache::is_reverse_proxy_cache_enabled()) {
berqReverseProxyCache::bypass();
// }
}
}
function flush_reverse_proxy_cache($slug = '/.*')
{
if (empty($slug)) {
$slug = '/';
}
// if ($slug == '/') {
// $slug = '';
// }
$page_url = home_url($slug);
$host = !empty($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : '';
berqReverseProxyCache::purge_cache($page_url);
}
function ingore_tracking_params($tracking_params)
{
$tracking_params = array_merge($tracking_params, ignoreParams::$query_params);
return $tracking_params;
}
function clear_cache_on_post_update($post_id, $post, $update)
{
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// if (!$update) {
// return;
// }
$can_flush_cache = apply_filters('berqwp_can_flush_cache_on_post_update', true);
if (!$can_flush_cache) {
return;
}
// If this is just a revision, don't run the function.
if (wp_is_post_revision($post_id)) {
return;
}
// prevents scheduled post public
// via wp cron
// if (!is_admin()) {
// return;
// }
$post_type = get_post_type($post_id);
$post_url = get_permalink($post_id);
// We need path with query parameters
$parsed_url = parse_url($post_url);
$path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
$query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
$path_with_query = $path . $query;
if (berqwp_is_slug_excludable($path_with_query)) {
return;
}
// Potentially cachable post types
$cachable_post_type_names = get_post_types(array(
'public' => true,
), 'names');
unset($cachable_post_type_names['attachment']);
if (!in_array($post_type, $cachable_post_type_names)) {
return;
}
global $berq_log;
$berq_log->info("Post updated [Post type - $post_type]: $post_url $post->post_status");
self::purge_page($post_url, true);
if (bwp_can_optimize_page_url($post_url)) {
warmup_cache_by_url($post_url);
}
$translation_urls = apply_filters('berqwp_page_translation_urls', [], $post_url);
if (!empty($translation_urls)) {
foreach ($translation_urls as $url) {
$berq_log->info("Purging translation for $post_url");
self::purge_page($url, true);
}
}
$this->flush_post_taxonomy_cache($post_id);
$this->flush_author_cache($post_id);
}
function flush_cdn()
{
$parsed_url = wp_parse_url(home_url());
$domain = $parsed_url['host'];
$args = [
'timeout' => 30,
'sslverify' => false,
'body' => ['flush_cdn' => $domain, 'license_key' => berqwp_get_license_key()]
];
wp_remote_post('https://boost.berqwp.com/photon/', $args);
// Flush cache
$this->delete_cache_files();
// clear local static files
$dir = optifer_cache . '/static/';
if (! is_dir($dir)) {
return;
}
$files = glob(rtrim($dir, '/') . '/*');
foreach ($files as $file) {
if (is_file($file)) {
unlink($file);
}
}
update_option('berqwp_uploaded_assets', [], false);
do_action('berqwp_purge_cdn');
}
function delete_cache_files($flush_all_sites = false)
{
global $berq_log;
$berq_log->info("Flushing all cache.");
// Define the cache directory
$cache_directory = bwp_get_cache_dir();
if (is_multisite() && $flush_all_sites) {
$cache_directory = optifer_cache . '/html/';
}
// Delete all cache files within the directory
berqwp_unlink_recursive($cache_directory);
// Delete external CSS cache
$external_cache_dir = optifer_cache . 'external/';
if (is_dir($external_cache_dir)) {
berqwp_unlink_recursive($external_cache_dir);
}
delete_transient('berqwp_warmup_running');
delete_transient('cache_warmup_in_progress');
delete_transient('berqwp_doing_cache_warmup');
// Remove require cache warning
update_option('bwp_require_flush_cache', 0);
do_action('berqwp_flush_all_cache');
}
static function should_cache() {
// Check if the current user is logged in and only allow GET requests
if (is_user_logged_in() || $_SERVER['REQUEST_METHOD'] !== 'GET') {
return false;
}
if (isset($_GET['creating_cache'])) {
return false;
}
if (is_admin() || is_preview() || is_404() || is_search()) {
return false;
}
if (defined('DOING_CRON') && DOING_CRON) {
return false;
}
if (defined('DOING_AJAX') && DOING_AJAX) {
return false;
}
if (defined('REST_REQUEST') && REST_REQUEST) {
return false;
}
if (php_sapi_name() === 'cli' || defined('WP_CLI')) {
return false;
}
if (!bwp_is_webpage()) {
return false;
}
if (!bwp_pass_cookie_requirement()) {
return false;
}
$berqconfigs = berqConfigs::getInstance();
$configs = $berqconfigs->get_configs();
if (empty($configs['optimization_method'])) {
return false;
}
if (berqwp_can_use_cloud()) {
if (empty(berqwp_get_license_key())) {
return false;
}
// if (!bwp_pass_account_requirement()) {
// return false;
// }
}
$bypass_cache = apply_filters('berqwp_bypass_cache', false);
if ($bypass_cache) {
return false;
}
return true;
}
static function get_page_url() {
$page_url = bwp_get_request_url();
// For sitemaps
if (strpos($page_url, '.xml') !== false || strpos($page_url, '.xsl') !== false) {
return;
}
// Return if page is excluded from cache
$current_page_url = bwp_get_request_url();
if (strpos($current_page_url, '?') !== false) {
$current_page_url = explode('?', $current_page_url)[0];
}
if (berqwp_is_page_url_excluded($current_page_url)) {
return;
}
// Remove ignored params from the slug
// $slug = berqwp_remove_ignore_params($slug_uri);
$page_url = berqwp_remove_ignore_params($page_url);
if (get_option('berqwp_enable_sandbox') == 1 && isset($_GET['berqwp'])) {
$page_url = explode('?berqwp', $page_url)[0];
} elseif (get_option('berqwp_enable_sandbox') == 1 && !isset($_GET['creating_cache'])) {
return false;
}
if (berqwp_is_slug_excludable($page_url)) {
return false;
}
return $page_url;
}
static function queue_page($page_url = null) {
if (empty($page_url)) {
if (!self::should_cache()) {
return;
}
$page_url = self::get_page_url();
}
if (empty($page_url)) {
return false;
}
// Disable cache for unknown query parameters
if (strpos($page_url, '?') !== false) {
return false;
}
if (!berqwp_can_use_cloud()) {
return false;
}
$status_code = http_response_code();
if ($status_code !== 200) {
return false;
}
// berqHeartbeat::add_queue($page_url);
warmup_cache_by_url($page_url);
}
static function miss_cache_headers() {
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0', true);
header('CDN-Cache-Control: no-store', true); // Cloudflare
header('Surrogate-Control: no-store', true); // Varnish
header('X-Accel-Expires: 0', true); // Nginx FastCGI
header("X-BerqWP-Cache: MISS");
}
function html_cache()
{
// Bypass cache for Photon
if (!empty($_COOKIE['berqwpnocache'])) {
self::miss_cache_headers();
return;
}
if (!self::should_cache()) {
self::miss_cache_headers();
return;
}
$page_url = self::get_page_url();
if (empty($page_url)) {
self::miss_cache_headers();
return;
}
// Disable cache for unknown query parameters
if (strpos($page_url, '?') !== false) {
self::miss_cache_headers();
return;
}
if (is_singular()) {
$post_type = get_post_type();
if (empty($post_type) || !in_array($post_type, get_option('berqwp_optimize_post_types'))) {
self::miss_cache_headers();
return;
}
} elseif (is_archive()) {
$queried_object = get_queried_object();
if ($queried_object instanceof WP_Term && !empty($queried_object->taxonomy)) {
$current_taxonomy = $queried_object->taxonomy;
if (!in_array($current_taxonomy, get_option('berqwp_optimize_taxonomies'))) {
self::miss_cache_headers();
return;
}
}
}
$status_code = http_response_code();
if ($status_code !== 200) {
self::miss_cache_headers();
return;
}
$berqconfigs = berqConfigs::getInstance();
$configs = $berqconfigs->get_configs();
$cache_key = md5($page_url);
$cache_directory = bwp_get_cache_dir();
$cache_file = $cache_directory . bwp_build_cache_path($page_url) . '/index.html.gz';
$cache_max_life = file_exists($cache_file) ? @filemtime($cache_file) + $configs['cache_lifespan'] : null;
if (file_exists($cache_file) && $cache_max_life > time()) {
header_remove('Content-Encoding');
$lastModified = filemtime($cache_file);
$etag = md5_file($cache_file);
header('ETag: ' . $etag);
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
header('X-File-Size: ' . filesize($cache_file), true);
header('Content-Type: text/html; charset=utf-8');
header("X-served: WP Hook");
header('Vary: Accept-Encoding, Cookie');
header("X-BerqWP-Cache: HIT");
if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified) || (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] === $etag)) {
// The client's cache is still valid based on Last-Modified, respond with a 304 Not Modified
header('HTTP/1.1 304 Not Modified');
// header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
// header("Expires: 0");
// header('Cache-Control: no-cache, must-revalidate');
header('Cache-Control: public, max-age=600, s-maxage=2592000, stale-while-revalidate=86400', true);
header('cdn-cache-control: max-age=2592000');
header('Cache-Tag: ' . wp_parse_url(home_url())['host']);
exit();
}
// Prevent PHP/Apache from re-compressing the already-gzipped cache file
if (ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
while (ob_get_level()) {
ob_end_clean();
}
header('Cache-Control: public, max-age=600, s-maxage=2592000, stale-while-revalidate=86400', true);
header('cdn-cache-control: max-age=2592000');
header('Cache-Tag: ' . wp_parse_url(home_url())['host']);
// header("Content-Security-Policy: script-src 'self' blob: 'unsafe-inline'");
header('Content-Encoding: gzip', true);
header('Content-Length: ' . filesize($cache_file), true);
readfile($cache_file);
exit();
}
self::miss_cache_headers();
self::purge_page($page_url);
if (!berqwp_can_use_cloud()) {
try {
$berqPageOptimizer = new berqPageOptimizer();
$berqPageOptimizer->set_slug(bwp_url_into_path($page_url));
$berqPageOptimizer->set_page($page_url);
$berqPageOptimizer->start_cache();
unset($berqPageOptimizer);
} catch (Exception $e) {
global $berq_log;
$berq_log->error($e->getMessage());
return;
} catch (Throwable $e) {
global $berq_log;
$berq_log->error($e->getMessage());
return;
}
}
return;
}
}
// $cache = new berqCache();
$cache = berqCache::getInstance();
}