255 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace ShortPixel\Controller;
 | 
						|
 | 
						|
if ( ! defined( 'ABSPATH' ) ) {
 | 
						|
 exit; // Exit if accessed directly.
 | 
						|
}
 | 
						|
 | 
						|
use ShortPixel\Controller\Queue\MediaLibraryQueue as MediaLibraryQueue;
 | 
						|
use ShortPixel\Controller\Queue\CustomQueue as CustomQueue;
 | 
						|
use ShortPixel\Controller\Queue\Queue as Queue;
 | 
						|
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | 
						|
 | 
						|
// Class for controlling bulk and reporting.
 | 
						|
class BulkController
 | 
						|
{
 | 
						|
   protected static $instance;
 | 
						|
   protected static $logName = 'shortpixel-bulk-logs';
 | 
						|
 | 
						|
   public function __construct()
 | 
						|
   {
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
   public static function getInstance()
 | 
						|
   {
 | 
						|
      if ( is_null(self::$instance))
 | 
						|
         self::$instance = new BulkController();
 | 
						|
 | 
						|
     return self::$instance;
 | 
						|
   }
 | 
						|
 | 
						|
   /** Create a new bulk, enqueue items for bulking
 | 
						|
   * @param $type String media or custom is supported.
 | 
						|
   * @param $customOp String   Not a usual optimize queue, but something else. options:
 | 
						|
   * 'bulk-restore', or 'migrate'.
 | 
						|
   */
 | 
						|
   public function createNewBulk($type = 'media', $customOp = null)
 | 
						|
   {
 | 
						|
      $optimizeController = new OptimizeController();
 | 
						|
      $optimizeController->setBulk(true);
 | 
						|
 | 
						|
			$fs = \wpSPIO()->filesystem();
 | 
						|
			$backupDir = $fs->getDirectory(SHORTPIXEL_BACKUP_FOLDER);
 | 
						|
			$current_log = $fs->getFile($backupDir->getPath() . 'current_bulk_' . $type . '.log');
 | 
						|
 | 
						|
			// When starting new bulk remove any open 'current logs';
 | 
						|
			if ($current_log->exists() && $current_log->is_writable())
 | 
						|
			{
 | 
						|
				 $current_log->delete();
 | 
						|
			}
 | 
						|
 | 
						|
      $Q = $optimizeController->getQueue($type);
 | 
						|
 | 
						|
      $Q->createNewBulk();
 | 
						|
 | 
						|
			$Q = $optimizeController->getQueue($type);
 | 
						|
 | 
						|
      if (! is_null($customOp))
 | 
						|
      {
 | 
						|
        $options = array();
 | 
						|
        if ($customOp == 'bulk-restore')
 | 
						|
        {
 | 
						|
          $options['numitems'] = 5;
 | 
						|
          $options['retry_limit'] = 5;
 | 
						|
          $options['process_timeout'] = 3000;
 | 
						|
        }
 | 
						|
        if ($customOp == 'migrate' || $customOp == 'removeLegacy')
 | 
						|
        {
 | 
						|
           $options['numitems'] = 200;
 | 
						|
 | 
						|
        }
 | 
						|
				$options = apply_filters('shortpixel/bulk/custom_options', $options, $customOp);
 | 
						|
        $Q->setCustomBulk($customOp, $options);
 | 
						|
      }
 | 
						|
 | 
						|
      return $Q->getStats();
 | 
						|
   }
 | 
						|
 | 
						|
	 public function isBulkRunning($type = 'media')
 | 
						|
	 {
 | 
						|
       $optimizeControl = new OptimizeController();
 | 
						|
       $optimizeControl->setBulk(true);
 | 
						|
 | 
						|
		   $queue = $optimizeControl->getQueue($type);
 | 
						|
 | 
						|
			 $stats = $queue->getStats();
 | 
						|
 | 
						|
			 if ( $stats->is_finished === false && $stats->total > 0)
 | 
						|
			 {
 | 
						|
			 	return true;
 | 
						|
		 	 }
 | 
						|
			 else
 | 
						|
			 {
 | 
						|
			 	return false;
 | 
						|
			}
 | 
						|
	 }
 | 
						|
 | 
						|
	 public function isAnyBulkRunning()
 | 
						|
	 {
 | 
						|
		   $bool = $this->isBulkRunning('media');
 | 
						|
			 if ($bool === false)
 | 
						|
			 {
 | 
						|
				   $bool = $this->isBulkRunning('custom');
 | 
						|
			 }
 | 
						|
 | 
						|
			 return $bool;
 | 
						|
	 }
 | 
						|
 | 
						|
   /*** Start the bulk run. Must deliver all queues at once due to processQueue bundling */
 | 
						|
   public function startBulk($types = 'media')
 | 
						|
   {
 | 
						|
       $optimizeControl = new OptimizeController();
 | 
						|
       $optimizeControl->setBulk(true);
 | 
						|
 | 
						|
			 if (! is_array($types))
 | 
						|
			 	 $types = array($types);
 | 
						|
 | 
						|
			 foreach($types as $type)
 | 
						|
			 {
 | 
						|
	       $q = $optimizeControl->getQueue($type);
 | 
						|
	       $q->startBulk();
 | 
						|
			 }
 | 
						|
 | 
						|
       return $optimizeControl->processQueue($types);
 | 
						|
   }
 | 
						|
 | 
						|
   public function finishBulk($type = 'media')
 | 
						|
   {
 | 
						|
     $optimizeControl = new OptimizeController();
 | 
						|
     $optimizeControl->setBulk(true);
 | 
						|
 | 
						|
     $q = $optimizeControl->getQueue($type);
 | 
						|
 | 
						|
		 $this->addLog($q);
 | 
						|
 | 
						|
		 $op = $q->getCustomDataItem('customOperation');
 | 
						|
 | 
						|
		 // When finishing, remove the Legacy Notice
 | 
						|
		 if ($op == 'migrate')
 | 
						|
		 {
 | 
						|
			 	AdminNoticesController::resetLegacyNotice();
 | 
						|
		 }
 | 
						|
 | 
						|
     $q->resetQueue();
 | 
						|
   }
 | 
						|
 | 
						|
   public function getLogs()
 | 
						|
   {
 | 
						|
        $logs = get_option(self::$logName, array());
 | 
						|
        return $logs;
 | 
						|
   }
 | 
						|
 | 
						|
	 public function getLog($logName)
 | 
						|
	 {
 | 
						|
  		 $fs = \wpSPIO()->filesystem();
 | 
						|
			 $backupDir = $fs->getDirectory(SHORTPIXEL_BACKUP_FOLDER);
 | 
						|
 | 
						|
			 $log = $fs->getFile($backupDir->getPath() . $logName);
 | 
						|
			 if ($log->exists())
 | 
						|
			 	 return $log;
 | 
						|
			 else
 | 
						|
			 	return false;
 | 
						|
	 }
 | 
						|
 | 
						|
	 public function getLogData($fileName)
 | 
						|
	 {
 | 
						|
		 		$logs = $this->getLogs();
 | 
						|
 | 
						|
				foreach($logs as $log)
 | 
						|
				{
 | 
						|
					 if (isset($log['logfile']) && $log['logfile'] == $fileName)
 | 
						|
					 	 return $log;
 | 
						|
				}
 | 
						|
 | 
						|
				return false;
 | 
						|
	 }
 | 
						|
 | 
						|
   protected function addLog($q)
 | 
						|
   {
 | 
						|
        //$data = (array) $stats;
 | 
						|
				$stats = $q->getStats(); // for the log
 | 
						|
				$type = $q->getType();
 | 
						|
			//	$customData = $q->getCustomDataItem('');
 | 
						|
 | 
						|
        if ($stats->done == 0 && $stats->fatal_errors == 0)
 | 
						|
				{
 | 
						|
          return; // nothing done, don't log
 | 
						|
				}
 | 
						|
 | 
						|
        $data['processed'] = $stats->done;
 | 
						|
        $data['not_processed'] = $stats->in_queue;
 | 
						|
        $data['errors'] = $stats->errors;
 | 
						|
        $data['fatal_errors'] = $stats->fatal_errors;
 | 
						|
 | 
						|
				$webpcount = $q->getCustomDataItem('webpcount');
 | 
						|
				$avifcount = $q->getCustomDataItem('avifcount');
 | 
						|
				$basecount = $q->getCustomDataItem('basecount');
 | 
						|
 | 
						|
				if (property_exists($stats, 'images'))
 | 
						|
					$data['total_images'] = $stats->images->images_done;
 | 
						|
 | 
						|
        $data['type'] = $type;
 | 
						|
				if ($q->getCustomDataItem('customOperation'))
 | 
						|
				{
 | 
						|
					$data['operation'] = $q->getCustomDataItem('customOperation');
 | 
						|
				}
 | 
						|
        $data['date'] = time();
 | 
						|
 | 
						|
        $logs = $this->getLogs();
 | 
						|
        $fs = \wpSPIO()->filesystem();
 | 
						|
        $backupDir = $fs->getDirectory(SHORTPIXEL_BACKUP_FOLDER);
 | 
						|
 | 
						|
        if (count($logs) == 10) // remove logs if more than 10.
 | 
						|
        {
 | 
						|
          $log = array_shift($logs);
 | 
						|
          //$log_date = $log['date'];
 | 
						|
					//$log_type = $log['type'];
 | 
						|
					if (isset($data['logfile']))
 | 
						|
					{
 | 
						|
						$logfile = $data['logfile'];
 | 
						|
 | 
						|
	          $fileLog = $fs->getFile($backupDir->getPath() . $logfile);
 | 
						|
	          if ($fileLog->exists())
 | 
						|
	            $fileLog->delete();
 | 
						|
					}
 | 
						|
        }
 | 
						|
 | 
						|
        $fileLog = $fs->getFile($backupDir->getPath() . 'current_bulk_' . $type . '.log');
 | 
						|
        $moveLog = $fs->getFile($backupDir->getPath() . 'bulk_' . $type. '_' . $data['date'] . '.log');
 | 
						|
 | 
						|
        if ($fileLog->exists())
 | 
						|
          $fileLog->move($moveLog);
 | 
						|
 | 
						|
				$data['logfile'] = 'bulk_' . $type . '_' . $data['date'] . '.log';
 | 
						|
        $logs[] = $data;
 | 
						|
 | 
						|
        $this->saveLogs($logs);
 | 
						|
   }
 | 
						|
 | 
						|
   protected function saveLogs($logs)
 | 
						|
   {
 | 
						|
        if (is_array($logs) && count($logs) > 0)
 | 
						|
          update_option(self::$logName, $logs, false);
 | 
						|
        else
 | 
						|
          delete_option(self::$logName);
 | 
						|
   }
 | 
						|
 | 
						|
	 // Removes Bulk Log .
 | 
						|
   public static function uninstallPlugin()
 | 
						|
   {
 | 
						|
      delete_option(self::$logName);
 | 
						|
   }
 | 
						|
 | 
						|
}  // class
 |