297 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			297 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace ShortPixel;
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
|  exit; // Exit if accessed directly.
 | |
| }
 | |
| 
 | |
| use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | |
| use ShortPixel\Controller\OptimizeController as OptimizeController;
 | |
| use ShortPixel\Controller\BulkController as BulkController;
 | |
| 
 | |
| use ShortPixel\Controller\Queue\Queue as Queue;
 | |
| use ShortPixel\Controller\ApiController as ApiController;
 | |
| use ShortPixel\Controller\ResponseController as ResponseController;
 | |
| 
 | |
| /**
 | |
| * Actions for running bulk operations from WP-CLI
 | |
| */
 | |
| class SpioBulk extends SpioCommandBase
 | |
| {
 | |
| 	   /**
 | |
| 	   * Starts the prepared queue(s). The bulk needs an express command to start processing.
 | |
| 		 * Once started, the queue(s) can be processed and finished with the run command.
 | |
| 	   *
 | |
| 	   * ## OPTIONS
 | |
| 
 | |
| 	   * [--queue=<name>]
 | |
| 	   * : Either 'media' or 'custom'. Omit the parameter to start both queues.
 | |
| 	   * ---
 | |
| 	   * default: media,custom
 | |
| 	   * options:
 | |
| 	   *   - media
 | |
| 	   *   - custom
 | |
| 	   * ---
 | |
| 	   *
 | |
| 	   * ## EXAMPLES
 | |
| 	   *
 | |
| 	   * wp spio bulk start
 | |
| 	   *
 | |
| 	   *
 | |
| 	   * @when after_wp_load
 | |
| 	   */
 | |
| 	  public function start($args, $assoc)
 | |
| 	  {
 | |
| 			 $bulkControl = BulkController::getInstance();
 | |
| 
 | |
| 			 $queue = $this->getQueueArgument($assoc);
 | |
| 
 | |
| 			 foreach($queue as $qname)
 | |
| 			 {
 | |
| 			 	$result = $bulkControl->startBulk($qname);
 | |
| 			 }
 | |
| 
 | |
| 			 \WP_CLI::Line('Start signal for Bulk Processing given.');
 | |
| 
 | |
| 			// $this->run($args, $assoc);
 | |
| 	     //$controller = new OptimizeController();
 | |
| 	     //$result = $controller->startBulk();
 | |
| 	  }
 | |
| 
 | |
| 
 | |
| 	   /**
 | |
| 	   * Automatically Bulk Processes everything that needs to be done.
 | |
| 	   *
 | |
| 	   * [--queue=<name>]
 | |
| 	   * : Either 'media' or 'custom'. Omit the parameter to process both queues.
 | |
|      * ---
 | |
| 	   * default: media,custom
 | |
| 	   * options:
 | |
| 	   *   - media
 | |
| 	   *   - custom
 | |
| 	   * ---
 | |
| 		 *
 | |
| 		 * [--limit=<num>]
 | |
| 		 * : Limit the amount of items being prepared.
 | |
| 		 *
 | |
| 		 * [--special=<migrate>]
 | |
| 		 * : Run the migration
 | |
| 
 | |
| 	   *
 | |
| 	   * ## EXAMPLES
 | |
| 	   *
 | |
| 	   * wp spio bulk auto
 | |
| 	   *
 | |
| 	   *
 | |
| 	   */
 | |
| 		public function auto($args, $assoc)
 | |
| 		{
 | |
| 			 	$queue = $this->getQueueArgument($assoc);
 | |
| 				$optimizeController = $this->getOptimizeController();
 | |
| 
 | |
| 				$bulkControl = BulkController::getInstance();
 | |
| 
 | |
| 				$running = true;
 | |
| 				$created = false;
 | |
| 
 | |
| 				 $this->settings();
 | |
| 				 sleep(2); // user can digest settings
 | |
| 
 | |
| 				while($running)
 | |
| 				{
 | |
| 						 	$data = $optimizeController->getStartupData();
 | |
| 							$combined = $data->total->stats;
 | |
| 
 | |
| 							// Is_finished is no queue running.
 | |
| 							if ($combined->is_preparing)
 | |
| 							{
 | |
| 								\WP_CLI::line('[Auto Bulk] Preparing .. ');
 | |
| 								 $this->prepare($args, $assoc);
 | |
| 								 $this->start($args, $assoc);
 | |
| 								 \WP_CLI::line('Preparing Run done');
 | |
| 							}
 | |
| 							elseif ($combined->is_running)
 | |
| 							{
 | |
| 								\WP_CLI::line('Bulk Running ...');
 | |
| 								 $this->run($args, $assoc); // Run All
 | |
| 							}
 | |
| 							elseif ($combined->total > 0 && $combined->done == 0 && $combined->is_running == false && $combined->is_preparing == false && $combined->is_finished == false)
 | |
| 							{
 | |
| 								 \WP_CLI::line('[Auto Bulk] Starting to process');
 | |
| 								 $this->status($args, $assoc);
 | |
|  								 $this->start($args, $assoc);
 | |
| 							}
 | |
| 						  elseif ($combined->is_finished)
 | |
| 							{
 | |
| 								  if ($combined->done > 0 || $created == true) // means we already ran the whole thing once.
 | |
| 									{
 | |
| 										\WP_CLI::Line('[Auto Bulk] Seems finished and done running');
 | |
| 										$running = false;
 | |
| 
 | |
| 										$this->finishBulk($args, $assoc);
 | |
| 
 | |
| 										break;
 | |
| 									}
 | |
| 									\WP_CLI::Line('[Auto Bulk] Creating New Queue');
 | |
| 									$this->create($args, $assoc);
 | |
| 									$created = true;
 | |
| 							}
 | |
| 							else
 | |
| 							{
 | |
| 								 \WP_CLI::error("[Auto Bulk] : Encountered nothing to do", true);
 | |
| 								 $running = false; // extra fallback
 | |
| 							}
 | |
| 
 | |
| 				}
 | |
|         
 | |
| 				\WP_CLI::log('Automatic Bulk ended');
 | |
| 		}
 | |
| 
 | |
| 	 /**
 | |
| 	 * Creates the queue(s) for bulk optimization of media library and/or custom media items.
 | |
| 	 *
 | |
| 	 * ## OPTIONS
 | |
| 	 *
 | |
| 	 * [--queue=<name>]
 | |
| 	 * : Either 'media' or 'custom'. Omit the parameter to create both queues.
 | |
| 	 * ---
 | |
| 	 * default: media,custom
 | |
| 	 * options:
 | |
| 	 *   - media
 | |
| 	 *   - custom
 | |
|    * [--special=<migrate>]
 | |
|    * : Run the migration
 | |
| 	 * ---
 | |
| 	 *
 | |
| 	 * ## EXAMPLES
 | |
| 	 *
 | |
| 	 *  wp spio bulk create
 | |
| 	 *
 | |
| 	 *
 | |
| 	 * @when after_wp_load
 | |
| 	 */
 | |
| 	  public function create($args, $assoc)
 | |
| 	  {
 | |
| 	    $bulkControl = BulkController::getInstance();
 | |
| 	    $json = new \stdClass;
 | |
| 	    $json->media = new \stdClass;
 | |
| 	    $json->custom = new \stdClass;
 | |
| 
 | |
| 			$queues = $this->getQueueArgument($assoc);
 | |
| 
 | |
|       $operation = null;
 | |
|       if (isset($assoc['special']))
 | |
|       {
 | |
|          switch ($assoc['special'])
 | |
|          {
 | |
|             case 'migrate':
 | |
|               $operation = 'migrate';
 | |
|               $queues = array('media'); // can only have one bulk, this.
 | |
|             break;
 | |
|          }
 | |
|       }
 | |
| 
 | |
| 			foreach($queues as $qname)
 | |
| 			{
 | |
| 	    	$stats = $bulkControl->createNewBulk($qname, $operation);
 | |
| 	    	$json->$qname->stats = $stats;
 | |
| 
 | |
| 				\WP_CLI::Line("Bulk $qname created. Ready to prepare");
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			$this->showResponses();
 | |
| 			return $stats;
 | |
| 	  }
 | |
| 
 | |
| 	 /**
 | |
| 	 * ## OPTIONS
 | |
| 	 *
 | |
| 	 * <start-id>
 | |
| 	 * : ID to start restore
 | |
| 	 *
 | |
| 	 * <end-id>
 | |
| 	 * : ID to stop restore
 | |
| 	 *
 | |
| 	 * [--type=<type>]
 | |
| 	 * : media or custom
 | |
| 	 * ---
 | |
| 	 * default: media
 | |
| 	 * options:
 | |
| 	 *   - media
 | |
| 	 *   - custom
 | |
| 	 * ---
 | |
| 	 *
 | |
| 	 * ## EXAMPLES
 | |
| 	 *
 | |
| 	 *   wp spio bulk restore 0 100
 | |
| 	 *
 | |
| 	 *
 | |
| 	 * @when after_wp_load
 | |
| 	 */
 | |
| 		/*public function restore($args, $assoc)
 | |
| 		{
 | |
| 				\WP_CLI::Line('Not yet implemented');
 | |
| 		} */
 | |
| 
 | |
| 
 | |
| 		protected function finishBulk($args, $assoc)
 | |
| 		{
 | |
| 		    $bulkControl = BulkController::getInstance();
 | |
| 	 			$queues = $this->getQueueArgument($assoc);
 | |
| 
 | |
| 				foreach($queues as $queue_name)
 | |
| 				{
 | |
| 					 $bulkControl->finishBulk($queue_name);
 | |
| 				}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		// To ensure the bulk switch is ok.
 | |
| 		protected function getOptimizeController()
 | |
| 		{
 | |
| 				$optimizeController = new OptimizeController();
 | |
| 				$optimizeController->setBulk(true);
 | |
| 				return $optimizeController;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		* Prepares the items by adding them to the queue(s). It runs only when the queue is in the preparing phase and finishes when everything is prepared.
 | |
| 		*
 | |
| 		*
 | |
| 		* [--queue=<name>]
 | |
| 		* : Either 'media' or 'custom'. Omit the parameter to run both queues.
 | |
| 		* ---
 | |
| 		* default: media,custom
 | |
| 		* options:
 | |
| 		*   - media
 | |
| 		*   - custom
 | |
| 		* ---
 | |
| 		*
 | |
| 		* [--limit=<num>]
 | |
| 		* : Limit the amount of items being prepared.
 | |
| 		*
 | |
| 		* ## EXAMPLES
 | |
| 		*
 | |
| 		*   wp spio bulk prepare
 | |
| 		*
 | |
| 		*/
 | |
| 			public function prepare($args, $assoc)
 | |
| 			{
 | |
| 					 $queues = $this->getQueueArgument($assoc);
 | |
| 					 $optimizeController = $this->getOptimizeController();
 | |
| 
 | |
| 						$data = $optimizeController->getStartupData();
 | |
| 
 | |
| 						if (! $data->total->stats->is_preparing)
 | |
| 						{
 | |
| 							 \WP_CLI::Error("No queues have status preparing, aborting");
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							 $assoc['wait'] = 0.5;
 | |
| 							 $bool = $this->run($args, $assoc);
 | |
| 						}
 | |
| 			}
 | |
| } // CLASS
 |