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
|