%PDF- %PDF-
| Direktori : /home/opti/www/stlc/wp-content/plugins/shortpixel-image-optimiser/class/Model/ |
| Current File : /home/opti/www/stlc/wp-content/plugins/shortpixel-image-optimiser/class/Model/EnvironmentModel.php |
<?php
namespace ShortPixel\Model;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
/** Loads a few environment variables handy to have nearby
*
* Notice - This is meant to be loaded via the plugin class. Easy access with wpSPIO()->getEnv().
*/
class EnvironmentModel extends \ShortPixel\Model
{
// Server and PHP
public $is_nginx;
public $is_apache;
public $is_gd_installed;
public $is_curl_installed;
private $disabled_functions = array();
// MultiSite
public $is_multisite;
public $is_mainsite;
// Integrations
public $has_nextgen;
// WordPress
public $is_front = false;
public $is_admin = false;
public $is_ajaxcall = false;
public $is_jsoncall = false;
public $is_croncall = false;
private $screen_is_set = false;
public $is_screen_to_use = false; // where shortpixel optimizer loads
public $is_our_screen = false; // where shortpixel hooks in more complicated functions.
public $is_gutenberg_editor = false;
public $is_bulk_page = false; // ShortPixel bulk screen.
public $screen_id = false;
// Debug flag
public $is_debug = false;
// Is the plugin configured to automatically optimize on upload hook?
public $is_autoprocess = false;
protected static $instance;
public $executionLimit;
public $executionStart;
public $memoryLimit;
public function __construct()
{
$this->setServer();
$this->setWordPress();
add_action('plugins_loaded', array($this, 'setIntegrations') ); // not set on construct.
add_action('current_screen', array($this, 'setScreen') ); // Not set on construct
}
public static function getInstance()
{
if (is_null(self::$instance))
self::$instance = new EnvironmentModel();
/*if (! self::$instance->screen_is_set)
self::$instance->setScreen(); */
return self::$instance;
}
/** Check ENV is a specific function is allowed. Use this with functions that might be turned off on configurations
* @param $function String The name of the function being tested
* Note: In future this function can be extended with other function edge cases.
*/
public function is_function_usable($function)
{
if (count($this->disabled_functions) == 0)
{
$disabled = ini_get('disable_functions');
$this->disabled_functions = explode(',', $disabled);
}
if (isset($this->disabled_functions[$function]))
return false;
if (function_exists($function))
return true;
return false;
}
public function checkPHPVersion($needed)
{
if (version_compare(PHP_VERSION, $needed) >= 0 )
{
return true;
}
return false;
}
/**
* Checks if a plugin is active. This uses the WP is_plugin_active with addiotional checks. Also should be able to provide alternate ways since is_plugin_active is fallible.
* @param [type] $name Name of the plugin
* @param boolean $type Check against all options ( in case plugin has i.e. pro version, by name )
* @return boolean Active or not
*/
public function plugin_active($name, $type = 'all')
{
if (!function_exists('is_plugin_active')) {
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
$plugins = [
'wpml' => 'sitepress-multilingual-cms/sitepress.php',
'polylang' => ['normal' => 'polylang/polylang.php',
'pro' => 'polylang-pro/polylang.php'],
'spai' => 'shortpixel-adaptive-images/short-pixel-ai.php',
's3-offload' => ['lite' => 'amazon-s3-and-cloudfront/wordpress-s3.php',
'pro' => 'amazon-s3-and-cloudfront-pro/amazon-s3-and-cloudfront-pro.php'],
'woocommerce' => 'woocommerce/woocommerce.php',
'envira' => [ 'lite' => 'envira-gallery-lite/envira-gallery-lite.php',
'pro' => 'envira-gallery/envira-gallery.php',
],
'soliquy' => ['lite' => 'soliloquy-lite/soliloquy-lite.php',
'pro' => 'soliloquy/soliloquy.php',
],
];
if (false === isset($plugins[$name]))
{
return false;
}
if (is_array($plugins[$name]))
{
$check_plugins = $plugins[$name];
}
else {
$check_plugins = [$plugins[$name]];
}
if ($type !== 'all')
{
$check_plugins = [$plugins[$name][$type]];
}
foreach($check_plugins as $index => $slug)
{
if (true === is_plugin_active($slug))
{
return true;
}
}
return false;
}
//https://www.php.net/manual/en/function.sys-getloadavg.php
public function getSystemLoad()
{
$load = sys_getloadavg();
}
/* https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-image-editor-imagick.php */
public function hasImagick()
{
$editor = wp_get_image_editor(\wpSPIO()->plugin_path('res/img/test.jpg'));
$className = get_class($editor);
if ($className == 'WP_Image_Editor_Imagick')
return true;
else
return false;
}
public function hasOffload()
{
$off = \ShortPixel\External\Offload\Offloader::getInstance();
$name = $off->getOffloadName();
if (is_null($name))
return false;
else
return true;
}
public function getOffloadName()
{
$off = \ShortPixel\External\Offload\Offloader::getInstance();
$name = $off->getOffloadName();
return $name;
}
public function useVirtualHeavyFunctions()
{
$bool = ($this->hasOffload()) ? false : true; // If has WP Offload, by default don't use.
$bool = apply_filters('shortpixel/file/virtual/heavy_features', $bool);
return $bool;
}
private function setServer()
{
$this->is_nginx = ! empty($_SERVER["SERVER_SOFTWARE"]) && strpos(strtolower(wp_unslash($_SERVER["SERVER_SOFTWARE"])), 'nginx') !== false ? true : false;
$this->is_apache = ! empty($_SERVER["SERVER_SOFTWARE"]) && strpos(strtolower(wp_unslash($_SERVER["SERVER_SOFTWARE"])), 'apache') !== false ? true : false;
$this->is_gd_installed = function_exists('imagecreatefrompng') && function_exists('imagejpeg');
$this->is_curl_installed = function_exists('curl_init');
$this->memoryLimit = $this->unitToInt(ini_get('memory_limit'));
$this->executionStart = time();
$this->executionLimit = intval(ini_get('max_execution_time'));
}
private function setWordPress()
{
$this->is_multisite = (function_exists("is_multisite") && is_multisite()) ? true : false;
$this->is_mainsite = (function_exists('is_main_site') && true === is_main_site()) ? true : false;
$this->determineFrontBack();
$this->is_ajaxcall = wp_doing_ajax();
$this->is_jsoncall = wp_is_json_request();
$this->is_croncall = wp_doing_cron();
$this->is_debug = Log::debugIsActive();
if (\wpSPIO()->settings()->autoMediaLibrary == 1)
$this->is_autoprocess = true;
}
// check if this request is front or back.
protected function determineFrontBack()
{
if ( is_admin() || wp_doing_ajax() )
$this->is_admin = true;
else
$this->is_front = true;
}
public function setScreen($screen)
{
// WordPress pages where we'll be active on.
// https://codex.wordpress.org/Plugin_API/Admin_Screen_Reference
$use_screens = array(
'edit-post_tag', // edit tags
'upload', // media library
'attachment', // edit media
'post', // post screen
'page', // page editor
'edit-post', // edit post
'new-post', // new post
'edit-page', // all pages
'media', // add new item screen
);
// var_dump($use_screens);
$use_screens = apply_filters('shortpixel/init/optimize_on_screens', $use_screens, $screen);
$this->screen_id = $screen->id;
if(is_array($use_screens) && in_array($screen->id, $use_screens)) {
$this->is_screen_to_use = true;
}
// Our pages.
$pages = \wpSPIO()->get_admin_pages();
// the main WP pages where SPIO hooks a lot of functions into, our operating area.
$wp_pages = array('upload', 'attachment');
$pages = array_merge($pages, $wp_pages);
/* pages can be null in certain cases i.e. plugin activation.
* treat those cases as improper screen set.
*/
if (is_null($pages))
{
return false;
}
if ( in_array($screen->id, $pages))
{
$this->is_screen_to_use = true;
$this->is_our_screen = true;
// Strpos instead of full screen id, because the first page (media_page) is not reliable and can change.
if ( strpos($screen->id, 'wp-short-pixel-bulk') !== false)
$this->is_bulk_page = true;
}
elseif (is_object($screen) && method_exists( $screen, 'is_block_editor' ) && $screen->is_block_editor() ) {
$this->is_screen_to_use = true;
$this->is_gutenberg_editor = true;
}
$this->screen_is_set = true;
}
public function setIntegrations()
{
$ng = \ShortPixel\NextGenController::getInstance();
$this->has_nextgen = $ng->has_nextgen();
}
//set default move as "list". only set once, it won't try to set the default mode again.
public function setDefaultViewModeList()
{
$settings = \wpSPIO()->settings();
if( $settings->mediaLibraryViewMode == false)
{
$settings->mediaLibraryViewMode = 1;
$currentUserID = false;
if ( function_exists('wp_get_current_user') ) {
$current_user = wp_get_current_user();
$currentUserID = $current_user->ID;
update_user_meta($currentUserID, "wp_media_library_mode", "list");
}
}
}
public function getRelativePluginSlug()
{
$dir = SHORTPIXEL_PLUGIN_DIR;
$file = SHORTPIXEL_PLUGIN_FILE;
$fs = \wpSPIO()->filesystem();
$plugins_dir = $fs->getDirectory($dir)->getParent();
$slug = str_replace($plugins_dir->getPath(), '', $file);
return $slug;
}
public function useDoubleWebpExtension()
{
if (defined('SHORTPIXEL_USE_DOUBLE_WEBP_EXTENSION') && SHORTPIXEL_USE_DOUBLE_WEBP_EXTENSION)
return true;
return false;
}
public function useDoubleAvifExtension()
{
if (defined('SHORTPIXEL_USE_DOUBLE_AVIF_EXTENSION') && SHORTPIXEL_USE_DOUBLE_AVIF_EXTENSION)
return true;
return false;
}
public function useTrustedMode()
{
if (defined('SHORTPIXEL_TRUSTED_MODE') && true === SHORTPIXEL_TRUSTED_MODE)
{
return true;
}
return false;
}
// function to limit runtimes in seconds..
public function IsOverTimeLimit($args = array())
{
$defaults = array(
'limit' => $this->executionLimit
);
$args = wp_parse_args($args, $defaults);
$limit = $args['limit'];
$start = $this->executionStart;
// No Limits
if ($limit <= 0)
return false;
$elapsed = time() - $start;
if ($elapsed <= 0)
{
return false;
}
// max execution is the percentage of max execution time one can take upon.
$limit_perc = round($limit/100 * apply_filters('spio/process/max_execution', 90));
if ($limit_perc <= $elapsed)
{
Log::addInfo('Process almost over execution time! - ' . $limit_perc . ' usage: ' . $elapsed );
return true;
}
return false;
}
public function IsOverMemoryLimit($runCount)
{
$memory_limit = $this->memoryLimit;
if (-1 === $memory_limit)
{
return false;
}
$current_mem = memory_get_usage();
$percentage_limit = 90;
$limit = round($memory_limit/100 * apply_filters('spio/process/max_memory', $percentage_limit));
if ($current_mem >= $limit)
{
Log::addInfo('Process over maximum memory! ' . $runCount . ' runs - Current Mem / Limit ' . $current_mem . ' ' . $limit . ' ( ' . $percentage_limit . ' %)');
return true;
}
else {
return false;
}
}
private function unitToInt($s)
{
if ((int) $s < 0)
{
return -1; // unlimited
}
return (int)preg_replace_callback('/(\-?\d+)(.?)/', function ($m) {
return $m[1] * pow(1024, strpos('BKMG', $m[2]));
}, strtoupper($s));
}
}