Linux puskom-ProLiant-DL385-Gen10 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64
/
home
/
puskom
/
mastur
/
hummingbird-performance
/
core
/
modules
/
//home/puskom/mastur/hummingbird-performance/core/modules/class-caching.php
<?php /** * Caching module. * * @package Hummingbird */ namespace Hummingbird\Core\Modules; use Hummingbird\Core\Module_Server; use Hummingbird\Core\Utils; use WP_Http_Cookie; if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Class Caching */ class Caching extends Module_Server { /** * Module slug. * * @var string */ protected $transient_slug = 'caching'; /** * Module status. * * @var array $status */ public $status; /** * Activate module. * * @since 1.9.0 * * @return bool */ public function enable() { // Enable caching in .htaccess (only for apache servers). $result = Module_Server::save_htaccess( 'caching' ); if ( $result ) { // Clear saved status. Utils::get_module( 'caching' )->clear_cache(); return true; } return false; } /** * Deactivate module. * * @since 1.9.0 * * @return bool */ public function disable() { // Disable caching in htaccess (only for apache servers). $result = Module_Server::unsave_htaccess( 'caching' ); if ( $result ) { // Clear saved status. Utils::get_module( 'caching' )->clear_cache(); return true; } return false; } /** * Analyze data. Overwrites parent method. * * @param bool $check_api If set to true, the api can be checked. * * @return array */ public function analyze_data( $check_api = false ) { $files = array( 'JavaScript' => WPHB_DIR_URL . 'core/modules/dummy/dummy-js.js', 'CSS' => WPHB_DIR_URL . 'core/modules/dummy/dummy-style.css', 'Media' => WPHB_DIR_URL . 'core/modules/dummy/dummy-media.pdf', 'Images' => WPHB_DIR_URL . 'core/modules/dummy/dummy-image.png', ); $results = array(); $try_api = false; foreach ( $files as $type => $file ) { $cookies = array(); foreach ( $_COOKIE as $name => $value ) { if ( strpos( $name, 'wordpress_' ) > -1 ) { $cookies[] = new WP_Http_Cookie( array( 'name' => $name, 'value' => $value, ) ); } } $args = array( 'cookies' => $cookies, 'sslverify' => false, ); $result = wp_remote_head( $file, $args ); $this->log( '----- analyzing headers for ' . $file ); $this->log( 'args: ' ); if ( isset( $args['cookies'] ) ) { unset( $args['cookies'] ); } $this->log( $args ); $this->log( 'result: ' ); $this->log( $result ); $cache_control = wp_remote_retrieve_header( $result, 'cache-control' ); $results[ $type ] = false; if ( $cache_control ) { if ( is_array( $cache_control ) ) { // Join the cache control header into a single string. $cache_control = join( ' ', $cache_control ); } if ( preg_match( '/max\-age=([0-9]*)/', $cache_control, $matches ) ) { if ( isset( $matches[1] ) ) { $seconds = absint( $matches[1] ); $results[ $type ] = $seconds; } } } else { $try_api = true; } } // Will only trigger on 're-check status' button click and there are some false values. if ( $try_api && $check_api ) { // Get the API results. $api = Utils::get_api(); $api_results = $api->performance->check_cache(); // This will prevent errors on local hosts and when API is not reachable. if ( ! is_wp_error( $api_results ) ) { $api_results = get_object_vars( $api_results ); foreach ( $files as $type => $file ) { $ltype = strtolower( $type ); if ( ! isset( $api_results[ $ltype ]->response_error ) && ! isset( $api_results[ $ltype ]->http_request_failed ) && absint( $api_results[ $ltype ] ) > 0 ) { $results[ $type ] = absint( $api_results[ $ltype ] ); } } } } do_action( 'wphb_caching_analize_data', $results ); return $results; } /** * Get code for Nginx * * @param array $expiry_times Type expiry times (javascript, css...). Used with React-based AJAX call update_expiry(). * * @return string */ public function get_nginx_code( $expiry_times = array() ) { if ( empty( $expiry_times ) ) { $options = $this->get_options(); } else { $options = $expiry_times; } $assets_expiration = explode( '/', $options['expiry_javascript'] ); $assets_expiration = $assets_expiration[0]; $css_expiration = explode( '/', $options['expiry_css'] ); $css_expiration = $css_expiration[0]; $media_expiration = explode( '/', $options['expiry_media'] ); $media_expiration = $media_expiration [0]; $images_expiration = explode( '/', $options['expiry_images'] ); $images_expiration = $images_expiration[0]; $code = 'location ~* \.(txt|xml|js)$ { expires %%ASSETS%%; } location ~* \.(css)$ { expires %%CSS%%; } location ~* \.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav|mp4|m4v|ogg|webm|aac|eot|ttf|otf|woff|woff2|svg)$ { expires %%MEDIA%%; } location ~* \.(jpg|jpeg|png|gif|swf|webp)$ { expires %%IMAGES%%; }'; $code = str_replace( '%%MEDIA%%', $media_expiration, $code ); $code = str_replace( '%%IMAGES%%', $images_expiration, $code ); $code = str_replace( '%%ASSETS%%', $assets_expiration, $code ); return str_replace( '%%CSS%%', $css_expiration, $code ); } /** * Get code for Apache * * @param array $expiry_times Type expiry times (javascript, css...). Used with React-based AJAX call caching_reload_snippet. * * @return string */ public function get_apache_code( $expiry_times = array() ) { if ( empty( $expiry_times ) ) { $options = $this->get_options(); } else { $options = $expiry_times; } $assets_expiration = explode( '/', $options['expiry_javascript'] ); $assets_expiration = $assets_expiration[1]; $css_expiration = explode( '/', $options['expiry_css'] ); $css_expiration = $css_expiration[1]; $media_expiration = explode( '/', $options['expiry_media'] ); $media_expiration = $media_expiration [1]; $images_expiration = explode( '/', $options['expiry_images'] ); $images_expiration = $images_expiration[1]; $code = '<IfModule mod_expires.c> ExpiresActive On ExpiresDefault A0 <FilesMatch "\.(txt|xml|js)$"> ExpiresDefault %%ASSETS%% </FilesMatch> <FilesMatch "\.(css)$"> ExpiresDefault %%CSS%% </FilesMatch> <FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav|mp4|m4v|ogg|webm|aac|eot|ttf|otf|woff|woff2|svg)$"> ExpiresDefault %%MEDIA%% </FilesMatch> <FilesMatch "\.(jpg|jpeg|png|gif|swf|webp)$"> ExpiresDefault %%IMAGES%% </FilesMatch> </IfModule> <IfModule mod_headers.c> <FilesMatch "\.(txt|xml|js)$"> Header set Cache-Control "max-age=%%ASSETS_HEAD%%" </FilesMatch> <FilesMatch "\.(css)$"> Header set Cache-Control "max-age=%%CSS_HEAD%%" </FilesMatch> <FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav|mp4|m4v|ogg|webm|aac|eot|ttf|otf|woff|woff2|svg)$"> Header set Cache-Control "max-age=%%MEDIA_HEAD%%" </FilesMatch> <FilesMatch "\.(jpg|jpeg|png|gif|swf|webp)$"> Header set Cache-Control "max-age=%%IMAGES_HEAD%%" </FilesMatch> </IfModule>'; $code = str_replace( '%%MEDIA%%', $media_expiration, $code ); $code = str_replace( '%%IMAGES%%', $images_expiration, $code ); $code = str_replace( '%%ASSETS%%', $assets_expiration, $code ); $code = str_replace( '%%CSS%%', $css_expiration, $code ); $code = str_replace( '%%MEDIA_HEAD%%', ltrim( $media_expiration, 'A' ), $code ); $code = str_replace( '%%IMAGES_HEAD%%', ltrim( $images_expiration, 'A' ), $code ); $code = str_replace( '%%ASSETS_HEAD%%', ltrim( $assets_expiration, 'A' ), $code ); return str_replace( '%%CSS_HEAD%%', ltrim( $css_expiration, 'A' ), $code ); } /** * Get an array of caching frequencies. * * @return array */ public static function get_frequencies() { return array( '1h/A3600' => __( '1 hour', 'wphb' ), '3h/A10800' => __( '3 hours', 'wphb' ), '4h/A14400' => __( '4 hours', 'wphb' ), '5h/A18000' => __( '5 hours', 'wphb' ), '6h/A21600' => __( '6 hours', 'wphb' ), '12h/A43200' => __( '12 hours', 'wphb' ), '16h/A57600' => __( '16 hours', 'wphb' ), '20h/A72000' => __( '20 hours', 'wphb' ), '1d/A86400' => __( '1 day', 'wphb' ), '2d/A172800' => __( '2 days', 'wphb' ), '3d/A259200' => __( '3 days', 'wphb' ), '4d/A345600' => __( '4 days', 'wphb' ), '5d/A432000' => __( '5 days', 'wphb' ), '8d/A691200' => __( '8 days', 'wphb' ), '16d/A1382400' => __( '16 days', 'wphb' ), '24d/A2073600' => __( '24 days', 'wphb' ), '1M/A2592000' => __( '1 month', 'wphb' ), '2M/A5184000' => __( '2 months', 'wphb' ), '3M/A7776000' => __( '3 months', 'wphb' ), '6M/A15552000' => __( '6 months', 'wphb' ), '1y/A31536000' => __( '1 year', 'wphb' ), ); } /** * Get recommended caching values. * * @return array */ public function get_recommended_caching_values() { return array( 'css' => array( 'label' => __( '1 year', 'wphb' ), 'value' => YEAR_IN_SECONDS, ), 'javascript' => array( 'label' => __( '1 year', 'wphb' ), 'value' => YEAR_IN_SECONDS, ), 'media' => array( 'label' => __( '1 year', 'wphb' ), 'value' => YEAR_IN_SECONDS, ), 'images' => array( 'label' => __( '1 year', 'wphb' ), 'value' => YEAR_IN_SECONDS, ), ); } /** * Get default caching types for HB or Cloudflare. * * @since 1.7.1 * @return array */ public function get_types() { $caching_types = array(); $caching_types['javascript'] = 'txt | xml | js'; $caching_types['css'] = 'css'; $caching_types['media'] = 'flv | ico | pdf | avi | mov | ppt | doc | mp3 | wmv | wav | mp4 | m4v | ogg | webm | aac | eot | ttf | otf | woff | woff2 | svg'; $caching_types['images'] = 'jpg | jpeg | png | gif | swf | webp'; $cloudflare = Utils::get_module( 'cloudflare' ); if ( $cloudflare->is_connected() && $cloudflare->is_zone_selected() ) { $caching_types['javascript'] = 'txt | xml | js'; $caching_types['css'] = 'css'; $caching_types['media'] = 'flv | ico | pdf | avi | mov | ppt | doc | mp3 | wmv | wav | mp4 | m4v | ogg | webm | aac | eot | ttf | otf | woff | woff2 | svg'; $caching_types['images'] = 'jpg | jpeg | png | gif | swf | webp'; $caching_types['cloudflare'] = 'bmp | pict | csv | pls | tif | tiff | eps | ejs | midi | mid | woff2 | svgz | docx | xlsx | xls | pptx | ps | class | jar'; } return $caching_types; } }