Passed
Pull Request — master (#323)
by Brian
16:26 queued 11:53
created
action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php 1 patch
Indentation   +185 added lines, -185 removed lines patch added patch discarded remove patch
@@ -9,189 +9,189 @@
 block discarded – undo
9 9
  */
10 10
 class ActionScheduler_WPCLI_QueueRunner extends ActionScheduler_Abstract_QueueRunner {
11 11
 
12
-	/** @var array */
13
-	protected $actions;
14
-
15
-	/** @var  ActionScheduler_ActionClaim */
16
-	protected $claim;
17
-
18
-	/** @var \cli\progress\Bar */
19
-	protected $progress_bar;
20
-
21
-	/**
22
-	 * ActionScheduler_WPCLI_QueueRunner constructor.
23
-	 *
24
-	 * @param ActionScheduler_Store             $store
25
-	 * @param ActionScheduler_FatalErrorMonitor $monitor
26
-	 * @param ActionScheduler_QueueCleaner      $cleaner
27
-	 *
28
-	 * @throws Exception When this is not run within WP CLI
29
-	 */
30
-	public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) {
31
-		if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) {
32
-			/* translators: %s php class name */
33
-			throw new Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) );
34
-		}
35
-
36
-		parent::__construct( $store, $monitor, $cleaner );
37
-	}
38
-
39
-	/**
40
-	 * Set up the Queue before processing.
41
-	 *
42
-	 * @author Jeremy Pry
43
-	 *
44
-	 * @param int    $batch_size The batch size to process.
45
-	 * @param array  $hooks      The hooks being used to filter the actions claimed in this batch.
46
-	 * @param string $group      The group of actions to claim with this batch.
47
-	 * @param bool   $force      Whether to force running even with too many concurrent processes.
48
-	 *
49
-	 * @return int The number of actions that will be run.
50
-	 * @throws \WP_CLI\ExitException When there are too many concurrent batches.
51
-	 */
52
-	public function setup( $batch_size, $hooks = array(), $group = '', $force = false ) {
53
-		$this->run_cleanup();
54
-		$this->add_hooks();
55
-
56
-		// Check to make sure there aren't too many concurrent processes running.
57
-		if ( $this->has_maximum_concurrent_batches() ) {
58
-			if ( $force ) {
59
-				WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) );
60
-			} else {
61
-				WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) );
62
-			}
63
-		}
64
-
65
-		// Stake a claim and store it.
66
-		$this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group );
67
-		$this->monitor->attach( $this->claim );
68
-		$this->actions = $this->claim->get_actions();
69
-
70
-		return count( $this->actions );
71
-	}
72
-
73
-	/**
74
-	 * Add our hooks to the appropriate actions.
75
-	 *
76
-	 * @author Jeremy Pry
77
-	 */
78
-	protected function add_hooks() {
79
-		add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) );
80
-		add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 );
81
-		add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 );
82
-	}
83
-
84
-	/**
85
-	 * Set up the WP CLI progress bar.
86
-	 *
87
-	 * @author Jeremy Pry
88
-	 */
89
-	protected function setup_progress_bar() {
90
-		$count              = count( $this->actions );
91
-		$this->progress_bar = new ProgressBar(
92
-			/* translators: %d: amount of actions */
93
-			sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), number_format_i18n( $count ) ),
94
-			$count
95
-		);
96
-	}
97
-
98
-	/**
99
-	 * Process actions in the queue.
100
-	 *
101
-	 * @author Jeremy Pry
102
-	 *
103
-	 * @param string $context Optional runner context. Default 'WP CLI'.
104
-	 *
105
-	 * @return int The number of actions processed.
106
-	 */
107
-	public function run( $context = 'WP CLI' ) {
108
-		do_action( 'action_scheduler_before_process_queue' );
109
-		$this->setup_progress_bar();
110
-		foreach ( $this->actions as $action_id ) {
111
-			// Error if we lost the claim.
112
-			if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) {
113
-				WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) );
114
-				break;
115
-			}
116
-
117
-			$this->process_action( $action_id, $context );
118
-			$this->progress_bar->tick();
119
-		}
120
-
121
-		$completed = $this->progress_bar->current();
122
-		$this->progress_bar->finish();
123
-		$this->store->release_claim( $this->claim );
124
-		do_action( 'action_scheduler_after_process_queue' );
125
-
126
-		return $completed;
127
-	}
128
-
129
-	/**
130
-	 * Handle WP CLI message when the action is starting.
131
-	 *
132
-	 * @author Jeremy Pry
133
-	 *
134
-	 * @param $action_id
135
-	 */
136
-	public function before_execute( $action_id ) {
137
-		/* translators: %s refers to the action ID */
138
-		WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) );
139
-	}
140
-
141
-	/**
142
-	 * Handle WP CLI message when the action has completed.
143
-	 *
144
-	 * @author Jeremy Pry
145
-	 *
146
-	 * @param int $action_id
147
-	 * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility.
148
-	 */
149
-	public function after_execute( $action_id, $action = null ) {
150
-		// backward compatibility
151
-		if ( null === $action ) {
152
-			$action = $this->store->fetch_action( $action_id );
153
-		}
154
-		/* translators: 1: action ID 2: hook name */
155
-		WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'action-scheduler' ), $action_id, $action->get_hook() ) );
156
-	}
157
-
158
-	/**
159
-	 * Handle WP CLI message when the action has failed.
160
-	 *
161
-	 * @author Jeremy Pry
162
-	 *
163
-	 * @param int       $action_id
164
-	 * @param Exception $exception
165
-	 * @throws \WP_CLI\ExitException With failure message.
166
-	 */
167
-	public function action_failed( $action_id, $exception ) {
168
-		WP_CLI::error(
169
-			/* translators: 1: action ID 2: exception message */
170
-			sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ),
171
-			false
172
-		);
173
-	}
174
-
175
-	/**
176
-	 * Sleep and help avoid hitting memory limit
177
-	 *
178
-	 * @param int $sleep_time Amount of seconds to sleep
179
-	 * @deprecated 3.0.0
180
-	 */
181
-	protected function stop_the_insanity( $sleep_time = 0 ) {
182
-		_deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' );
183
-
184
-		ActionScheduler_DataController::free_memory();
185
-	}
186
-
187
-	/**
188
-	 * Maybe trigger the stop_the_insanity() method to free up memory.
189
-	 */
190
-	protected function maybe_stop_the_insanity() {
191
-		// The value returned by progress_bar->current() might be padded. Remove padding, and convert to int.
192
-		$current_iteration = intval( trim( $this->progress_bar->current() ) );
193
-		if ( 0 === $current_iteration % 50 ) {
194
-			$this->stop_the_insanity();
195
-		}
196
-	}
12
+    /** @var array */
13
+    protected $actions;
14
+
15
+    /** @var  ActionScheduler_ActionClaim */
16
+    protected $claim;
17
+
18
+    /** @var \cli\progress\Bar */
19
+    protected $progress_bar;
20
+
21
+    /**
22
+     * ActionScheduler_WPCLI_QueueRunner constructor.
23
+     *
24
+     * @param ActionScheduler_Store             $store
25
+     * @param ActionScheduler_FatalErrorMonitor $monitor
26
+     * @param ActionScheduler_QueueCleaner      $cleaner
27
+     *
28
+     * @throws Exception When this is not run within WP CLI
29
+     */
30
+    public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) {
31
+        if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) {
32
+            /* translators: %s php class name */
33
+            throw new Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) );
34
+        }
35
+
36
+        parent::__construct( $store, $monitor, $cleaner );
37
+    }
38
+
39
+    /**
40
+     * Set up the Queue before processing.
41
+     *
42
+     * @author Jeremy Pry
43
+     *
44
+     * @param int    $batch_size The batch size to process.
45
+     * @param array  $hooks      The hooks being used to filter the actions claimed in this batch.
46
+     * @param string $group      The group of actions to claim with this batch.
47
+     * @param bool   $force      Whether to force running even with too many concurrent processes.
48
+     *
49
+     * @return int The number of actions that will be run.
50
+     * @throws \WP_CLI\ExitException When there are too many concurrent batches.
51
+     */
52
+    public function setup( $batch_size, $hooks = array(), $group = '', $force = false ) {
53
+        $this->run_cleanup();
54
+        $this->add_hooks();
55
+
56
+        // Check to make sure there aren't too many concurrent processes running.
57
+        if ( $this->has_maximum_concurrent_batches() ) {
58
+            if ( $force ) {
59
+                WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) );
60
+            } else {
61
+                WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) );
62
+            }
63
+        }
64
+
65
+        // Stake a claim and store it.
66
+        $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group );
67
+        $this->monitor->attach( $this->claim );
68
+        $this->actions = $this->claim->get_actions();
69
+
70
+        return count( $this->actions );
71
+    }
72
+
73
+    /**
74
+     * Add our hooks to the appropriate actions.
75
+     *
76
+     * @author Jeremy Pry
77
+     */
78
+    protected function add_hooks() {
79
+        add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) );
80
+        add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 );
81
+        add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 );
82
+    }
83
+
84
+    /**
85
+     * Set up the WP CLI progress bar.
86
+     *
87
+     * @author Jeremy Pry
88
+     */
89
+    protected function setup_progress_bar() {
90
+        $count              = count( $this->actions );
91
+        $this->progress_bar = new ProgressBar(
92
+            /* translators: %d: amount of actions */
93
+            sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), number_format_i18n( $count ) ),
94
+            $count
95
+        );
96
+    }
97
+
98
+    /**
99
+     * Process actions in the queue.
100
+     *
101
+     * @author Jeremy Pry
102
+     *
103
+     * @param string $context Optional runner context. Default 'WP CLI'.
104
+     *
105
+     * @return int The number of actions processed.
106
+     */
107
+    public function run( $context = 'WP CLI' ) {
108
+        do_action( 'action_scheduler_before_process_queue' );
109
+        $this->setup_progress_bar();
110
+        foreach ( $this->actions as $action_id ) {
111
+            // Error if we lost the claim.
112
+            if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) {
113
+                WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) );
114
+                break;
115
+            }
116
+
117
+            $this->process_action( $action_id, $context );
118
+            $this->progress_bar->tick();
119
+        }
120
+
121
+        $completed = $this->progress_bar->current();
122
+        $this->progress_bar->finish();
123
+        $this->store->release_claim( $this->claim );
124
+        do_action( 'action_scheduler_after_process_queue' );
125
+
126
+        return $completed;
127
+    }
128
+
129
+    /**
130
+     * Handle WP CLI message when the action is starting.
131
+     *
132
+     * @author Jeremy Pry
133
+     *
134
+     * @param $action_id
135
+     */
136
+    public function before_execute( $action_id ) {
137
+        /* translators: %s refers to the action ID */
138
+        WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) );
139
+    }
140
+
141
+    /**
142
+     * Handle WP CLI message when the action has completed.
143
+     *
144
+     * @author Jeremy Pry
145
+     *
146
+     * @param int $action_id
147
+     * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility.
148
+     */
149
+    public function after_execute( $action_id, $action = null ) {
150
+        // backward compatibility
151
+        if ( null === $action ) {
152
+            $action = $this->store->fetch_action( $action_id );
153
+        }
154
+        /* translators: 1: action ID 2: hook name */
155
+        WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'action-scheduler' ), $action_id, $action->get_hook() ) );
156
+    }
157
+
158
+    /**
159
+     * Handle WP CLI message when the action has failed.
160
+     *
161
+     * @author Jeremy Pry
162
+     *
163
+     * @param int       $action_id
164
+     * @param Exception $exception
165
+     * @throws \WP_CLI\ExitException With failure message.
166
+     */
167
+    public function action_failed( $action_id, $exception ) {
168
+        WP_CLI::error(
169
+            /* translators: 1: action ID 2: exception message */
170
+            sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ),
171
+            false
172
+        );
173
+    }
174
+
175
+    /**
176
+     * Sleep and help avoid hitting memory limit
177
+     *
178
+     * @param int $sleep_time Amount of seconds to sleep
179
+     * @deprecated 3.0.0
180
+     */
181
+    protected function stop_the_insanity( $sleep_time = 0 ) {
182
+        _deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' );
183
+
184
+        ActionScheduler_DataController::free_memory();
185
+    }
186
+
187
+    /**
188
+     * Maybe trigger the stop_the_insanity() method to free up memory.
189
+     */
190
+    protected function maybe_stop_the_insanity() {
191
+        // The value returned by progress_bar->current() might be padded. Remove padding, and convert to int.
192
+        $current_iteration = intval( trim( $this->progress_bar->current() ) );
193
+        if ( 0 === $current_iteration % 50 ) {
194
+            $this->stop_the_insanity();
195
+        }
196
+    }
197 197
 }
Please login to merge, or discard this patch.
includes/libraries/action-scheduler/classes/WP_CLI/Migration_Command.php 1 patch
Indentation   +124 added lines, -124 removed lines patch added patch discarded remove patch
@@ -21,128 +21,128 @@
 block discarded – undo
21 21
  */
22 22
 class Migration_Command extends WP_CLI_Command {
23 23
 
24
-	/** @var int */
25
-	private $total_processed = 0;
26
-
27
-	/**
28
-	 * Register the command with WP-CLI
29
-	 */
30
-	public function register() {
31
-		if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
32
-			return;
33
-		}
34
-
35
-		WP_CLI::add_command( 'action-scheduler migrate', [ $this, 'migrate' ], [
36
-			'shortdesc' => 'Migrates actions to the DB tables store',
37
-			'synopsis'  => [
38
-				[
39
-					'type'        => 'assoc',
40
-					'name'        => 'batch-size',
41
-					'optional'    => true,
42
-					'default'     => 100,
43
-					'description' => 'The number of actions to process in each batch',
44
-				],
45
-				[
46
-					'type'        => 'assoc',
47
-					'name'        => 'free-memory-on',
48
-					'optional'    => true,
49
-					'default'     => 50,
50
-					'description' => 'The number of actions to process between freeing memory. 0 disables freeing memory',
51
-				],
52
-				[
53
-					'type'        => 'assoc',
54
-					'name'        => 'pause',
55
-					'optional'    => true,
56
-					'default'     => 0,
57
-					'description' => 'The number of seconds to pause when freeing memory',
58
-				],
59
-				[
60
-					'type'        => 'flag',
61
-					'name'        => 'dry-run',
62
-					'optional'    => true,
63
-					'description' => 'Reports on the actions that would have been migrated, but does not change any data',
64
-				],
65
-			],
66
-		] );
67
-	}
68
-
69
-	/**
70
-	 * Process the data migration.
71
-	 *
72
-	 * @param array $positional_args Required for WP CLI. Not used in migration.
73
-	 * @param array $assoc_args Optional arguments.
74
-	 *
75
-	 * @return void
76
-	 */
77
-	public function migrate( $positional_args, $assoc_args ) {
78
-		$this->init_logging();
79
-
80
-		$config = $this->get_migration_config( $assoc_args );
81
-		$runner = new Runner( $config );
82
-		$runner->init_destination();
83
-
84
-		$batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100;
85
-		$free_on    = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50;
86
-		$sleep      = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0;
87
-		\ActionScheduler_DataController::set_free_ticks( $free_on );
88
-		\ActionScheduler_DataController::set_sleep_time( $sleep );
89
-
90
-		do {
91
-			$actions_processed     = $runner->run( $batch_size );
92
-			$this->total_processed += $actions_processed;
93
-		} while ( $actions_processed > 0 );
94
-
95
-		if ( ! $config->get_dry_run() ) {
96
-			// let the scheduler know that there's nothing left to do
97
-			$scheduler = new Scheduler();
98
-			$scheduler->mark_complete();
99
-		}
100
-
101
-		WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) );
102
-	}
103
-
104
-	/**
105
-	 * Build the config object used to create the Runner
106
-	 *
107
-	 * @param array $args Optional arguments.
108
-	 *
109
-	 * @return ActionScheduler\Migration\Config
110
-	 */
111
-	private function get_migration_config( $args ) {
112
-		$args = wp_parse_args( $args, [
113
-			'dry-run' => false,
114
-		] );
115
-
116
-		$config = Controller::instance()->get_migration_config_object();
117
-		$config->set_dry_run( ! empty( $args[ 'dry-run' ] ) );
118
-
119
-		return $config;
120
-	}
121
-
122
-	/**
123
-	 * Hook command line logging into migration actions.
124
-	 */
125
-	private function init_logging() {
126
-		add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) {
127
-			WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) );
128
-		}, 10, 1 );
129
-		add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) {
130
-			WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) );
131
-		}, 10, 1 );
132
-		add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) {
133
-			WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) );
134
-		}, 10, 1 );
135
-		add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) {
136
-			WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) );
137
-		}, 10, 2 );
138
-		add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) {
139
-			WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) );
140
-		}, 10, 2 );
141
-		add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) {
142
-			WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) );
143
-		}, 10, 1 );
144
-		add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) {
145
-			WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) );
146
-		}, 10, 1 );
147
-	}
24
+    /** @var int */
25
+    private $total_processed = 0;
26
+
27
+    /**
28
+     * Register the command with WP-CLI
29
+     */
30
+    public function register() {
31
+        if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
32
+            return;
33
+        }
34
+
35
+        WP_CLI::add_command( 'action-scheduler migrate', [ $this, 'migrate' ], [
36
+            'shortdesc' => 'Migrates actions to the DB tables store',
37
+            'synopsis'  => [
38
+                [
39
+                    'type'        => 'assoc',
40
+                    'name'        => 'batch-size',
41
+                    'optional'    => true,
42
+                    'default'     => 100,
43
+                    'description' => 'The number of actions to process in each batch',
44
+                ],
45
+                [
46
+                    'type'        => 'assoc',
47
+                    'name'        => 'free-memory-on',
48
+                    'optional'    => true,
49
+                    'default'     => 50,
50
+                    'description' => 'The number of actions to process between freeing memory. 0 disables freeing memory',
51
+                ],
52
+                [
53
+                    'type'        => 'assoc',
54
+                    'name'        => 'pause',
55
+                    'optional'    => true,
56
+                    'default'     => 0,
57
+                    'description' => 'The number of seconds to pause when freeing memory',
58
+                ],
59
+                [
60
+                    'type'        => 'flag',
61
+                    'name'        => 'dry-run',
62
+                    'optional'    => true,
63
+                    'description' => 'Reports on the actions that would have been migrated, but does not change any data',
64
+                ],
65
+            ],
66
+        ] );
67
+    }
68
+
69
+    /**
70
+     * Process the data migration.
71
+     *
72
+     * @param array $positional_args Required for WP CLI. Not used in migration.
73
+     * @param array $assoc_args Optional arguments.
74
+     *
75
+     * @return void
76
+     */
77
+    public function migrate( $positional_args, $assoc_args ) {
78
+        $this->init_logging();
79
+
80
+        $config = $this->get_migration_config( $assoc_args );
81
+        $runner = new Runner( $config );
82
+        $runner->init_destination();
83
+
84
+        $batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100;
85
+        $free_on    = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50;
86
+        $sleep      = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0;
87
+        \ActionScheduler_DataController::set_free_ticks( $free_on );
88
+        \ActionScheduler_DataController::set_sleep_time( $sleep );
89
+
90
+        do {
91
+            $actions_processed     = $runner->run( $batch_size );
92
+            $this->total_processed += $actions_processed;
93
+        } while ( $actions_processed > 0 );
94
+
95
+        if ( ! $config->get_dry_run() ) {
96
+            // let the scheduler know that there's nothing left to do
97
+            $scheduler = new Scheduler();
98
+            $scheduler->mark_complete();
99
+        }
100
+
101
+        WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) );
102
+    }
103
+
104
+    /**
105
+     * Build the config object used to create the Runner
106
+     *
107
+     * @param array $args Optional arguments.
108
+     *
109
+     * @return ActionScheduler\Migration\Config
110
+     */
111
+    private function get_migration_config( $args ) {
112
+        $args = wp_parse_args( $args, [
113
+            'dry-run' => false,
114
+        ] );
115
+
116
+        $config = Controller::instance()->get_migration_config_object();
117
+        $config->set_dry_run( ! empty( $args[ 'dry-run' ] ) );
118
+
119
+        return $config;
120
+    }
121
+
122
+    /**
123
+     * Hook command line logging into migration actions.
124
+     */
125
+    private function init_logging() {
126
+        add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) {
127
+            WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) );
128
+        }, 10, 1 );
129
+        add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) {
130
+            WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) );
131
+        }, 10, 1 );
132
+        add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) {
133
+            WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) );
134
+        }, 10, 1 );
135
+        add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) {
136
+            WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) );
137
+        }, 10, 2 );
138
+        add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) {
139
+            WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) );
140
+        }, 10, 2 );
141
+        add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) {
142
+            WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) );
143
+        }, 10, 1 );
144
+        add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) {
145
+            WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) );
146
+        }, 10, 1 );
147
+    }
148 148
 }
Please login to merge, or discard this patch.
action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php 1 patch
Indentation   +138 added lines, -138 removed lines patch added patch discarded remove patch
@@ -5,154 +5,154 @@
 block discarded – undo
5 5
  */
6 6
 class ActionScheduler_WPCLI_Scheduler_command extends WP_CLI_Command {
7 7
 
8
-	/**
9
-	 * Run the Action Scheduler
10
-	 *
11
-	 * ## OPTIONS
12
-	 *
13
-	 * [--batch-size=<size>]
14
-	 * : The maximum number of actions to run. Defaults to 100.
15
-	 *
16
-	 * [--batches=<size>]
17
-	 * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue being executed until all actions are complete.
18
-	 *
19
-	 * [--cleanup-batch-size=<size>]
20
-	 * : The maximum number of actions to clean up. Defaults to the value of --batch-size.
21
-	 *
22
-	 * [--hooks=<hooks>]
23
-	 * : Only run actions with the specified hook. Omitting this option runs actions with any hook. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=hook_one,hook_two,hook_three`
24
-	 *
25
-	 * [--group=<group>]
26
-	 * : Only run actions from the specified group. Omitting this option runs actions from all groups.
27
-	 *
28
-	 * [--free-memory-on=<count>]
29
-	 * : The number of actions to process between freeing memory. 0 disables freeing memory. Default 50.
30
-	 *
31
-	 * [--pause=<seconds>]
32
-	 * : The number of seconds to pause when freeing memory. Default no pause.
33
-	 *
34
-	 * [--force]
35
-	 * : Whether to force execution despite the maximum number of concurrent processes being exceeded.
36
-	 *
37
-	 * @param array $args Positional arguments.
38
-	 * @param array $assoc_args Keyed arguments.
39
-	 * @throws \WP_CLI\ExitException When an error occurs.
40
-	 *
41
-	 * @subcommand run
42
-	 */
43
-	public function run( $args, $assoc_args ) {
44
-		// Handle passed arguments.
45
-		$batch   = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 100 ) );
46
-		$batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) );
47
-		$clean   = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'cleanup-batch-size', $batch ) );
48
-		$hooks   = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) );
49
-		$hooks   = array_filter( array_map( 'trim', $hooks ) );
50
-		$group   = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' );
51
-		$free_on = \WP_CLI\Utils\get_flag_value( $assoc_args, 'free-memory-on', '' );
52
-		$sleep   = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', '' );
53
-		$force   = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false );
8
+    /**
9
+     * Run the Action Scheduler
10
+     *
11
+     * ## OPTIONS
12
+     *
13
+     * [--batch-size=<size>]
14
+     * : The maximum number of actions to run. Defaults to 100.
15
+     *
16
+     * [--batches=<size>]
17
+     * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue being executed until all actions are complete.
18
+     *
19
+     * [--cleanup-batch-size=<size>]
20
+     * : The maximum number of actions to clean up. Defaults to the value of --batch-size.
21
+     *
22
+     * [--hooks=<hooks>]
23
+     * : Only run actions with the specified hook. Omitting this option runs actions with any hook. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=hook_one,hook_two,hook_three`
24
+     *
25
+     * [--group=<group>]
26
+     * : Only run actions from the specified group. Omitting this option runs actions from all groups.
27
+     *
28
+     * [--free-memory-on=<count>]
29
+     * : The number of actions to process between freeing memory. 0 disables freeing memory. Default 50.
30
+     *
31
+     * [--pause=<seconds>]
32
+     * : The number of seconds to pause when freeing memory. Default no pause.
33
+     *
34
+     * [--force]
35
+     * : Whether to force execution despite the maximum number of concurrent processes being exceeded.
36
+     *
37
+     * @param array $args Positional arguments.
38
+     * @param array $assoc_args Keyed arguments.
39
+     * @throws \WP_CLI\ExitException When an error occurs.
40
+     *
41
+     * @subcommand run
42
+     */
43
+    public function run( $args, $assoc_args ) {
44
+        // Handle passed arguments.
45
+        $batch   = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 100 ) );
46
+        $batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) );
47
+        $clean   = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'cleanup-batch-size', $batch ) );
48
+        $hooks   = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) );
49
+        $hooks   = array_filter( array_map( 'trim', $hooks ) );
50
+        $group   = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' );
51
+        $free_on = \WP_CLI\Utils\get_flag_value( $assoc_args, 'free-memory-on', '' );
52
+        $sleep   = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', '' );
53
+        $force   = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false );
54 54
 
55
-		ActionScheduler_DataController::set_free_ticks( $free_on );
56
-		ActionScheduler_DataController::set_sleep_time( $sleep );
55
+        ActionScheduler_DataController::set_free_ticks( $free_on );
56
+        ActionScheduler_DataController::set_sleep_time( $sleep );
57 57
 
58
-		$batches_completed = 0;
59
-		$actions_completed = 0;
60
-		$unlimited         = $batches === 0;
58
+        $batches_completed = 0;
59
+        $actions_completed = 0;
60
+        $unlimited         = $batches === 0;
61 61
 
62
-		try {
63
-			// Custom queue cleaner instance.
64
-			$cleaner = new ActionScheduler_QueueCleaner( null, $clean );
62
+        try {
63
+            // Custom queue cleaner instance.
64
+            $cleaner = new ActionScheduler_QueueCleaner( null, $clean );
65 65
 
66
-			// Get the queue runner instance
67
-			$runner = new ActionScheduler_WPCLI_QueueRunner( null, null, $cleaner );
66
+            // Get the queue runner instance
67
+            $runner = new ActionScheduler_WPCLI_QueueRunner( null, null, $cleaner );
68 68
 
69
-			// Determine how many tasks will be run in the first batch.
70
-			$total = $runner->setup( $batch, $hooks, $group, $force );
69
+            // Determine how many tasks will be run in the first batch.
70
+            $total = $runner->setup( $batch, $hooks, $group, $force );
71 71
 
72
-			// Run actions for as long as possible.
73
-			while ( $total > 0 ) {
74
-				$this->print_total_actions( $total );
75
-				$actions_completed += $runner->run();
76
-				$batches_completed++;
72
+            // Run actions for as long as possible.
73
+            while ( $total > 0 ) {
74
+                $this->print_total_actions( $total );
75
+                $actions_completed += $runner->run();
76
+                $batches_completed++;
77 77
 
78
-				// Maybe set up tasks for the next batch.
79
-				$total = ( $unlimited || $batches_completed < $batches ) ? $runner->setup( $batch, $hooks, $group, $force ) : 0;
80
-			}
81
-		} catch ( Exception $e ) {
82
-			$this->print_error( $e );
83
-		}
78
+                // Maybe set up tasks for the next batch.
79
+                $total = ( $unlimited || $batches_completed < $batches ) ? $runner->setup( $batch, $hooks, $group, $force ) : 0;
80
+            }
81
+        } catch ( Exception $e ) {
82
+            $this->print_error( $e );
83
+        }
84 84
 
85
-		$this->print_total_batches( $batches_completed );
86
-		$this->print_success( $actions_completed );
87
-	}
85
+        $this->print_total_batches( $batches_completed );
86
+        $this->print_success( $actions_completed );
87
+    }
88 88
 
89
-	/**
90
-	 * Print WP CLI message about how many actions are about to be processed.
91
-	 *
92
-	 * @author Jeremy Pry
93
-	 *
94
-	 * @param int $total
95
-	 */
96
-	protected function print_total_actions( $total ) {
97
-		WP_CLI::log(
98
-			sprintf(
99
-				/* translators: %d refers to how many scheduled taks were found to run */
100
-				_n( 'Found %d scheduled task', 'Found %d scheduled tasks', $total, 'action-scheduler' ),
101
-				number_format_i18n( $total )
102
-			)
103
-		);
104
-	}
89
+    /**
90
+     * Print WP CLI message about how many actions are about to be processed.
91
+     *
92
+     * @author Jeremy Pry
93
+     *
94
+     * @param int $total
95
+     */
96
+    protected function print_total_actions( $total ) {
97
+        WP_CLI::log(
98
+            sprintf(
99
+                /* translators: %d refers to how many scheduled taks were found to run */
100
+                _n( 'Found %d scheduled task', 'Found %d scheduled tasks', $total, 'action-scheduler' ),
101
+                number_format_i18n( $total )
102
+            )
103
+        );
104
+    }
105 105
 
106
-	/**
107
-	 * Print WP CLI message about how many batches of actions were processed.
108
-	 *
109
-	 * @author Jeremy Pry
110
-	 *
111
-	 * @param int $batches_completed
112
-	 */
113
-	protected function print_total_batches( $batches_completed ) {
114
-		WP_CLI::log(
115
-			sprintf(
116
-				/* translators: %d refers to the total number of batches executed */
117
-				_n( '%d batch executed.', '%d batches executed.', $batches_completed, 'action-scheduler' ),
118
-				number_format_i18n( $batches_completed )
119
-			)
120
-		);
121
-	}
106
+    /**
107
+     * Print WP CLI message about how many batches of actions were processed.
108
+     *
109
+     * @author Jeremy Pry
110
+     *
111
+     * @param int $batches_completed
112
+     */
113
+    protected function print_total_batches( $batches_completed ) {
114
+        WP_CLI::log(
115
+            sprintf(
116
+                /* translators: %d refers to the total number of batches executed */
117
+                _n( '%d batch executed.', '%d batches executed.', $batches_completed, 'action-scheduler' ),
118
+                number_format_i18n( $batches_completed )
119
+            )
120
+        );
121
+    }
122 122
 
123
-	/**
124
-	 * Convert an exception into a WP CLI error.
125
-	 *
126
-	 * @author Jeremy Pry
127
-	 *
128
-	 * @param Exception $e The error object.
129
-	 *
130
-	 * @throws \WP_CLI\ExitException
131
-	 */
132
-	protected function print_error( Exception $e ) {
133
-		WP_CLI::error(
134
-			sprintf(
135
-				/* translators: %s refers to the exception error message */
136
-				__( 'There was an error running the action scheduler: %s', 'action-scheduler' ),
137
-				$e->getMessage()
138
-			)
139
-		);
140
-	}
123
+    /**
124
+     * Convert an exception into a WP CLI error.
125
+     *
126
+     * @author Jeremy Pry
127
+     *
128
+     * @param Exception $e The error object.
129
+     *
130
+     * @throws \WP_CLI\ExitException
131
+     */
132
+    protected function print_error( Exception $e ) {
133
+        WP_CLI::error(
134
+            sprintf(
135
+                /* translators: %s refers to the exception error message */
136
+                __( 'There was an error running the action scheduler: %s', 'action-scheduler' ),
137
+                $e->getMessage()
138
+            )
139
+        );
140
+    }
141 141
 
142
-	/**
143
-	 * Print a success message with the number of completed actions.
144
-	 *
145
-	 * @author Jeremy Pry
146
-	 *
147
-	 * @param int $actions_completed
148
-	 */
149
-	protected function print_success( $actions_completed ) {
150
-		WP_CLI::success(
151
-			sprintf(
152
-				/* translators: %d refers to the total number of taskes completed */
153
-				_n( '%d scheduled task completed.', '%d scheduled tasks completed.', $actions_completed, 'action-scheduler' ),
154
-				number_format_i18n( $actions_completed )
155
-			)
156
-		);
157
-	}
142
+    /**
143
+     * Print a success message with the number of completed actions.
144
+     *
145
+     * @author Jeremy Pry
146
+     *
147
+     * @param int $actions_completed
148
+     */
149
+    protected function print_success( $actions_completed ) {
150
+        WP_CLI::success(
151
+            sprintf(
152
+                /* translators: %d refers to the total number of taskes completed */
153
+                _n( '%d scheduled task completed.', '%d scheduled tasks completed.', $actions_completed, 'action-scheduler' ),
154
+                number_format_i18n( $actions_completed )
155
+            )
156
+        );
157
+    }
158 158
 }
Please login to merge, or discard this patch.
includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php 1 patch
Indentation   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -7,70 +7,70 @@
 block discarded – undo
7 7
  */
8 8
 class ActionScheduler_DateTime extends DateTime {
9 9
 
10
-	/**
11
-	 * UTC offset.
12
-	 *
13
-	 * Only used when a timezone is not set. When a timezone string is
14
-	 * used, this will be set to 0.
15
-	 *
16
-	 * @var int
17
-	 */
18
-	protected $utcOffset = 0;
10
+    /**
11
+     * UTC offset.
12
+     *
13
+     * Only used when a timezone is not set. When a timezone string is
14
+     * used, this will be set to 0.
15
+     *
16
+     * @var int
17
+     */
18
+    protected $utcOffset = 0;
19 19
 
20
-	/**
21
-	 * Get the unix timestamp of the current object.
22
-	 *
23
-	 * Missing in PHP 5.2 so just here so it can be supported consistently.
24
-	 *
25
-	 * @return int
26
-	 */
27
-	public function getTimestamp() {
28
-		return method_exists( 'DateTime', 'getTimestamp' ) ? parent::getTimestamp() : $this->format( 'U' );
29
-	}
20
+    /**
21
+     * Get the unix timestamp of the current object.
22
+     *
23
+     * Missing in PHP 5.2 so just here so it can be supported consistently.
24
+     *
25
+     * @return int
26
+     */
27
+    public function getTimestamp() {
28
+        return method_exists( 'DateTime', 'getTimestamp' ) ? parent::getTimestamp() : $this->format( 'U' );
29
+    }
30 30
 
31
-	/**
32
-	 * Set the UTC offset.
33
-	 *
34
-	 * This represents a fixed offset instead of a timezone setting.
35
-	 *
36
-	 * @param $offset
37
-	 */
38
-	public function setUtcOffset( $offset ) {
39
-		$this->utcOffset = intval( $offset );
40
-	}
31
+    /**
32
+     * Set the UTC offset.
33
+     *
34
+     * This represents a fixed offset instead of a timezone setting.
35
+     *
36
+     * @param $offset
37
+     */
38
+    public function setUtcOffset( $offset ) {
39
+        $this->utcOffset = intval( $offset );
40
+    }
41 41
 
42
-	/**
43
-	 * Returns the timezone offset.
44
-	 *
45
-	 * @return int
46
-	 * @link http://php.net/manual/en/datetime.getoffset.php
47
-	 */
48
-	public function getOffset() {
49
-		return $this->utcOffset ? $this->utcOffset : parent::getOffset();
50
-	}
42
+    /**
43
+     * Returns the timezone offset.
44
+     *
45
+     * @return int
46
+     * @link http://php.net/manual/en/datetime.getoffset.php
47
+     */
48
+    public function getOffset() {
49
+        return $this->utcOffset ? $this->utcOffset : parent::getOffset();
50
+    }
51 51
 
52
-	/**
53
-	 * Set the TimeZone associated with the DateTime
54
-	 *
55
-	 * @param DateTimeZone $timezone
56
-	 *
57
-	 * @return static
58
-	 * @link http://php.net/manual/en/datetime.settimezone.php
59
-	 */
60
-	public function setTimezone( $timezone ) {
61
-		$this->utcOffset = 0;
62
-		parent::setTimezone( $timezone );
52
+    /**
53
+     * Set the TimeZone associated with the DateTime
54
+     *
55
+     * @param DateTimeZone $timezone
56
+     *
57
+     * @return static
58
+     * @link http://php.net/manual/en/datetime.settimezone.php
59
+     */
60
+    public function setTimezone( $timezone ) {
61
+        $this->utcOffset = 0;
62
+        parent::setTimezone( $timezone );
63 63
 
64
-		return $this;
65
-	}
64
+        return $this;
65
+    }
66 66
 
67
-	/**
68
-	 * Get the timestamp with the WordPress timezone offset added or subtracted.
69
-	 *
70
-	 * @since  3.0.0
71
-	 * @return int
72
-	 */
73
-	public function getOffsetTimestamp() {
74
-		return $this->getTimestamp() + $this->getOffset();
75
-	}
67
+    /**
68
+     * Get the timestamp with the WordPress timezone offset added or subtracted.
69
+     *
70
+     * @since  3.0.0
71
+     * @return int
72
+     */
73
+    public function getOffsetTimestamp() {
74
+        return $this->getTimestamp() + $this->getOffset();
75
+    }
76 76
 }
Please login to merge, or discard this patch.
includes/libraries/action-scheduler/classes/ActionScheduler_LogEntry.php 1 patch
Indentation   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -5,63 +5,63 @@
 block discarded – undo
5 5
  */
6 6
 class ActionScheduler_LogEntry {
7 7
 
8
-	/**
9
-	 * @var int $action_id
10
-	 */
11
-	protected $action_id =  '';
8
+    /**
9
+     * @var int $action_id
10
+     */
11
+    protected $action_id =  '';
12 12
 
13
-	/**
14
-	 * @var string $message
15
-	 */
16
-	protected $message =  '';
13
+    /**
14
+     * @var string $message
15
+     */
16
+    protected $message =  '';
17 17
 
18
-	/**
19
-	 * @var Datetime $date
20
-	 */
21
-	protected $date;
18
+    /**
19
+     * @var Datetime $date
20
+     */
21
+    protected $date;
22 22
 
23
-	/**
24
-	 * Constructor
25
-	 *
26
-	 * @param mixed  $action_id Action ID
27
-	 * @param string $message   Message
28
-	 * @param Datetime $date    Datetime object with the time when this log entry was created. If this parameter is
29
-	 *                          not provided a new Datetime object (with current time) will be created.
30
-	 */
31
-	public function __construct( $action_id, $message, $date = null ) {
23
+    /**
24
+     * Constructor
25
+     *
26
+     * @param mixed  $action_id Action ID
27
+     * @param string $message   Message
28
+     * @param Datetime $date    Datetime object with the time when this log entry was created. If this parameter is
29
+     *                          not provided a new Datetime object (with current time) will be created.
30
+     */
31
+    public function __construct( $action_id, $message, $date = null ) {
32 32
 
33
-		/*
33
+        /*
34 34
 		 * ActionScheduler_wpCommentLogger::get_entry() previously passed a 3rd param of $comment->comment_type
35 35
 		 * to ActionScheduler_LogEntry::__construct(), goodness knows why, and the Follow-up Emails plugin
36 36
 		 * hard-codes loading its own version of ActionScheduler_wpCommentLogger with that out-dated method,
37 37
 		 * goodness knows why, so we need to guard against that here instead of using a DateTime type declaration
38 38
 		 * for the constructor's 3rd param of $date and causing a fatal error with older versions of FUE.
39 39
 		 */
40
-		if ( null !== $date && ! is_a( $date, 'DateTime' ) ) {
41
-			_doing_it_wrong( __METHOD__, 'The third parameter must be a valid DateTime instance, or null.', '2.0.0' );
42
-			$date = null;
43
-		}
40
+        if ( null !== $date && ! is_a( $date, 'DateTime' ) ) {
41
+            _doing_it_wrong( __METHOD__, 'The third parameter must be a valid DateTime instance, or null.', '2.0.0' );
42
+            $date = null;
43
+        }
44 44
 
45
-		$this->action_id = $action_id;
46
-		$this->message   = $message;
47
-		$this->date      = $date ? $date : new Datetime;
48
-	}
45
+        $this->action_id = $action_id;
46
+        $this->message   = $message;
47
+        $this->date      = $date ? $date : new Datetime;
48
+    }
49 49
 
50
-	/**
51
-	 * Returns the date when this log entry was created
52
-	 *
53
-	 * @return Datetime
54
-	 */
55
-	public function get_date() {
56
-		return $this->date;
57
-	}
50
+    /**
51
+     * Returns the date when this log entry was created
52
+     *
53
+     * @return Datetime
54
+     */
55
+    public function get_date() {
56
+        return $this->date;
57
+    }
58 58
 
59
-	public function get_action_id() {
60
-		return $this->action_id;
61
-	}
59
+    public function get_action_id() {
60
+        return $this->action_id;
61
+    }
62 62
 
63
-	public function get_message() {
64
-		return $this->message;
65
-	}
63
+    public function get_message() {
64
+        return $this->message;
65
+    }
66 66
 }
67 67
 
Please login to merge, or discard this patch.
libraries/action-scheduler/classes/ActionScheduler_DataController.php 1 patch
Indentation   +170 added lines, -170 removed lines patch added patch discarded remove patch
@@ -14,174 +14,174 @@
 block discarded – undo
14 14
  * @since 3.0.0
15 15
  */
16 16
 class ActionScheduler_DataController {
17
-	/** Action data store class name. */
18
-	const DATASTORE_CLASS = 'ActionScheduler_DBStore';
19
-
20
-	/** Logger data store class name. */
21
-	const LOGGER_CLASS    = 'ActionScheduler_DBLogger';
22
-
23
-	/** Migration status option name. */
24
-	const STATUS_FLAG     = 'action_scheduler_migration_status';
25
-
26
-	/** Migration status option value. */
27
-	const STATUS_COMPLETE = 'complete';
28
-
29
-	/** Migration minimum required PHP version. */
30
-	const MIN_PHP_VERSION = '5.5';
31
-
32
-	/** @var ActionScheduler_DataController */
33
-	private static $instance;
34
-
35
-	/** @var int */
36
-	private static $sleep_time = 0;
37
-
38
-	/** @var int */
39
-	private static $free_ticks = 50;
40
-
41
-	/**
42
-	 * Get a flag indicating whether the migration environment dependencies are met.
43
-	 *
44
-	 * @return bool
45
-	 */
46
-	public static function dependencies_met() {
47
-		$php_support = version_compare( PHP_VERSION, self::MIN_PHP_VERSION, '>=' );
48
-		return $php_support && apply_filters( 'action_scheduler_migration_dependencies_met', true );
49
-	}
50
-
51
-	/**
52
-	 * Get a flag indicating whether the migration is complete.
53
-	 *
54
-	 * @return bool Whether the flag has been set marking the migration as complete
55
-	 */
56
-	public static function is_migration_complete() {
57
-		return get_option( self::STATUS_FLAG ) === self::STATUS_COMPLETE;
58
-	}
59
-
60
-	/**
61
-	 * Mark the migration as complete.
62
-	 */
63
-	public static function mark_migration_complete() {
64
-		update_option( self::STATUS_FLAG, self::STATUS_COMPLETE );
65
-	}
66
-
67
-	/**
68
-	 * Unmark migration when a plugin is de-activated. Will not work in case of silent activation, for example in an update.
69
-	 * We do this to mitigate the bug of lost actions which happens if there was an AS 2.x to AS 3.x migration in the past, but that plugin is now
70
-	 * deactivated and the site was running on AS 2.x again.
71
-	 */
72
-	public static function mark_migration_incomplete() {
73
-		delete_option( self::STATUS_FLAG );
74
-	}
75
-
76
-	/**
77
-	 * Set the action store class name.
78
-	 *
79
-	 * @param string $class Classname of the store class.
80
-	 *
81
-	 * @return string
82
-	 */
83
-	public static function set_store_class( $class ) {
84
-		return self::DATASTORE_CLASS;
85
-	}
86
-
87
-	/**
88
-	 * Set the action logger class name.
89
-	 *
90
-	 * @param string $class Classname of the logger class.
91
-	 *
92
-	 * @return string
93
-	 */
94
-	public static function set_logger_class( $class ) {
95
-		return self::LOGGER_CLASS;
96
-	}
97
-
98
-	/**
99
-	 * Set the sleep time in seconds.
100
-	 *
101
-	 * @param integer $sleep_time The number of seconds to pause before resuming operation.
102
-	 */
103
-	public static function set_sleep_time( $sleep_time ) {
104
-		self::$sleep_time = $sleep_time;
105
-	}
106
-
107
-	/**
108
-	 * Set the tick count required for freeing memory.
109
-	 *
110
-	 * @param integer $free_ticks The number of ticks to free memory on.
111
-	 */
112
-	public static function set_free_ticks( $free_ticks ) {
113
-		self::$free_ticks = $free_ticks;
114
-	}
115
-
116
-	/**
117
-	 * Free memory if conditions are met.
118
-	 *
119
-	 * @param int $ticks Current tick count.
120
-	 */
121
-	public static function maybe_free_memory( $ticks ) {
122
-		if ( self::$free_ticks && 0 === $ticks % self::$free_ticks ) {
123
-			self::free_memory();
124
-		}
125
-	}
126
-
127
-	/**
128
-	 * Reduce memory footprint by clearing the database query and object caches.
129
-	 */
130
-	public static function free_memory() {
131
-		if ( 0 < self::$sleep_time ) {
132
-			/* translators: %d: amount of time */
133
-			\WP_CLI::warning( sprintf( _n( 'Stopped the insanity for %d second', 'Stopped the insanity for %d seconds', self::$sleep_time, 'action-scheduler' ), self::$sleep_time ) );
134
-			sleep( self::$sleep_time );
135
-		}
136
-
137
-		\WP_CLI::warning( __( 'Attempting to reduce used memory...', 'action-scheduler' ) );
138
-
139
-		/**
140
-		 * @var $wpdb            \wpdb
141
-		 * @var $wp_object_cache \WP_Object_Cache
142
-		 */
143
-		global $wpdb, $wp_object_cache;
144
-
145
-		$wpdb->queries = array();
146
-
147
-		if ( ! is_a( $wp_object_cache, 'WP_Object_Cache' ) ) {
148
-			return;
149
-		}
150
-
151
-		$wp_object_cache->group_ops      = array();
152
-		$wp_object_cache->stats          = array();
153
-		$wp_object_cache->memcache_debug = array();
154
-		$wp_object_cache->cache          = array();
155
-
156
-		if ( is_callable( array( $wp_object_cache, '__remoteset' ) ) ) {
157
-			call_user_func( array( $wp_object_cache, '__remoteset' ) ); // important
158
-		}
159
-	}
160
-
161
-	/**
162
-	 * Connect to table datastores if migration is complete.
163
-	 * Otherwise, proceed with the migration if the dependencies have been met.
164
-	 */
165
-	public static function init() {
166
-		if ( self::is_migration_complete() ) {
167
-			add_filter( 'action_scheduler_store_class', array( 'ActionScheduler_DataController', 'set_store_class' ), 100 );
168
-			add_filter( 'action_scheduler_logger_class', array( 'ActionScheduler_DataController', 'set_logger_class' ), 100 );
169
-			add_action( 'deactivate_plugin', array( 'ActionScheduler_DataController', 'mark_migration_incomplete' ) );
170
-		} elseif ( self::dependencies_met() ) {
171
-			Controller::init();
172
-		}
173
-
174
-		add_action( 'action_scheduler/progress_tick', array( 'ActionScheduler_DataController', 'maybe_free_memory' ) );
175
-	}
176
-
177
-	/**
178
-	 * Singleton factory.
179
-	 */
180
-	public static function instance() {
181
-		if ( ! isset( self::$instance ) ) {
182
-			self::$instance = new static();
183
-		}
184
-
185
-		return self::$instance;
186
-	}
17
+    /** Action data store class name. */
18
+    const DATASTORE_CLASS = 'ActionScheduler_DBStore';
19
+
20
+    /** Logger data store class name. */
21
+    const LOGGER_CLASS    = 'ActionScheduler_DBLogger';
22
+
23
+    /** Migration status option name. */
24
+    const STATUS_FLAG     = 'action_scheduler_migration_status';
25
+
26
+    /** Migration status option value. */
27
+    const STATUS_COMPLETE = 'complete';
28
+
29
+    /** Migration minimum required PHP version. */
30
+    const MIN_PHP_VERSION = '5.5';
31
+
32
+    /** @var ActionScheduler_DataController */
33
+    private static $instance;
34
+
35
+    /** @var int */
36
+    private static $sleep_time = 0;
37
+
38
+    /** @var int */
39
+    private static $free_ticks = 50;
40
+
41
+    /**
42
+     * Get a flag indicating whether the migration environment dependencies are met.
43
+     *
44
+     * @return bool
45
+     */
46
+    public static function dependencies_met() {
47
+        $php_support = version_compare( PHP_VERSION, self::MIN_PHP_VERSION, '>=' );
48
+        return $php_support && apply_filters( 'action_scheduler_migration_dependencies_met', true );
49
+    }
50
+
51
+    /**
52
+     * Get a flag indicating whether the migration is complete.
53
+     *
54
+     * @return bool Whether the flag has been set marking the migration as complete
55
+     */
56
+    public static function is_migration_complete() {
57
+        return get_option( self::STATUS_FLAG ) === self::STATUS_COMPLETE;
58
+    }
59
+
60
+    /**
61
+     * Mark the migration as complete.
62
+     */
63
+    public static function mark_migration_complete() {
64
+        update_option( self::STATUS_FLAG, self::STATUS_COMPLETE );
65
+    }
66
+
67
+    /**
68
+     * Unmark migration when a plugin is de-activated. Will not work in case of silent activation, for example in an update.
69
+     * We do this to mitigate the bug of lost actions which happens if there was an AS 2.x to AS 3.x migration in the past, but that plugin is now
70
+     * deactivated and the site was running on AS 2.x again.
71
+     */
72
+    public static function mark_migration_incomplete() {
73
+        delete_option( self::STATUS_FLAG );
74
+    }
75
+
76
+    /**
77
+     * Set the action store class name.
78
+     *
79
+     * @param string $class Classname of the store class.
80
+     *
81
+     * @return string
82
+     */
83
+    public static function set_store_class( $class ) {
84
+        return self::DATASTORE_CLASS;
85
+    }
86
+
87
+    /**
88
+     * Set the action logger class name.
89
+     *
90
+     * @param string $class Classname of the logger class.
91
+     *
92
+     * @return string
93
+     */
94
+    public static function set_logger_class( $class ) {
95
+        return self::LOGGER_CLASS;
96
+    }
97
+
98
+    /**
99
+     * Set the sleep time in seconds.
100
+     *
101
+     * @param integer $sleep_time The number of seconds to pause before resuming operation.
102
+     */
103
+    public static function set_sleep_time( $sleep_time ) {
104
+        self::$sleep_time = $sleep_time;
105
+    }
106
+
107
+    /**
108
+     * Set the tick count required for freeing memory.
109
+     *
110
+     * @param integer $free_ticks The number of ticks to free memory on.
111
+     */
112
+    public static function set_free_ticks( $free_ticks ) {
113
+        self::$free_ticks = $free_ticks;
114
+    }
115
+
116
+    /**
117
+     * Free memory if conditions are met.
118
+     *
119
+     * @param int $ticks Current tick count.
120
+     */
121
+    public static function maybe_free_memory( $ticks ) {
122
+        if ( self::$free_ticks && 0 === $ticks % self::$free_ticks ) {
123
+            self::free_memory();
124
+        }
125
+    }
126
+
127
+    /**
128
+     * Reduce memory footprint by clearing the database query and object caches.
129
+     */
130
+    public static function free_memory() {
131
+        if ( 0 < self::$sleep_time ) {
132
+            /* translators: %d: amount of time */
133
+            \WP_CLI::warning( sprintf( _n( 'Stopped the insanity for %d second', 'Stopped the insanity for %d seconds', self::$sleep_time, 'action-scheduler' ), self::$sleep_time ) );
134
+            sleep( self::$sleep_time );
135
+        }
136
+
137
+        \WP_CLI::warning( __( 'Attempting to reduce used memory...', 'action-scheduler' ) );
138
+
139
+        /**
140
+         * @var $wpdb            \wpdb
141
+         * @var $wp_object_cache \WP_Object_Cache
142
+         */
143
+        global $wpdb, $wp_object_cache;
144
+
145
+        $wpdb->queries = array();
146
+
147
+        if ( ! is_a( $wp_object_cache, 'WP_Object_Cache' ) ) {
148
+            return;
149
+        }
150
+
151
+        $wp_object_cache->group_ops      = array();
152
+        $wp_object_cache->stats          = array();
153
+        $wp_object_cache->memcache_debug = array();
154
+        $wp_object_cache->cache          = array();
155
+
156
+        if ( is_callable( array( $wp_object_cache, '__remoteset' ) ) ) {
157
+            call_user_func( array( $wp_object_cache, '__remoteset' ) ); // important
158
+        }
159
+    }
160
+
161
+    /**
162
+     * Connect to table datastores if migration is complete.
163
+     * Otherwise, proceed with the migration if the dependencies have been met.
164
+     */
165
+    public static function init() {
166
+        if ( self::is_migration_complete() ) {
167
+            add_filter( 'action_scheduler_store_class', array( 'ActionScheduler_DataController', 'set_store_class' ), 100 );
168
+            add_filter( 'action_scheduler_logger_class', array( 'ActionScheduler_DataController', 'set_logger_class' ), 100 );
169
+            add_action( 'deactivate_plugin', array( 'ActionScheduler_DataController', 'mark_migration_incomplete' ) );
170
+        } elseif ( self::dependencies_met() ) {
171
+            Controller::init();
172
+        }
173
+
174
+        add_action( 'action_scheduler/progress_tick', array( 'ActionScheduler_DataController', 'maybe_free_memory' ) );
175
+    }
176
+
177
+    /**
178
+     * Singleton factory.
179
+     */
180
+    public static function instance() {
181
+        if ( ! isset( self::$instance ) ) {
182
+            self::$instance = new static();
183
+        }
184
+
185
+        return self::$instance;
186
+    }
187 187
 }
Please login to merge, or discard this patch.
action-scheduler/classes/ActionScheduler_InvalidActionException.php 1 patch
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -9,39 +9,39 @@
 block discarded – undo
9 9
  */
10 10
 class ActionScheduler_InvalidActionException extends \InvalidArgumentException implements ActionScheduler_Exception {
11 11
 
12
-	/**
13
-	 * Create a new exception when the action's schedule cannot be fetched.
14
-	 *
15
-	 * @param string $action_id The action ID with bad args.
16
-	 * @return static
17
-	 */
18
-	public static function from_schedule( $action_id, $schedule ) {
19
-		$message = sprintf(
20
-			/* translators: 1: action ID 2: schedule */
21
-			__( 'Action [%1$s] has an invalid schedule: %2$s', 'action-scheduler' ),
22
-			$action_id,
23
-			var_export( $schedule, true )
24
-		);
12
+    /**
13
+     * Create a new exception when the action's schedule cannot be fetched.
14
+     *
15
+     * @param string $action_id The action ID with bad args.
16
+     * @return static
17
+     */
18
+    public static function from_schedule( $action_id, $schedule ) {
19
+        $message = sprintf(
20
+            /* translators: 1: action ID 2: schedule */
21
+            __( 'Action [%1$s] has an invalid schedule: %2$s', 'action-scheduler' ),
22
+            $action_id,
23
+            var_export( $schedule, true )
24
+        );
25 25
 
26
-		return new static( $message );
27
-	}
26
+        return new static( $message );
27
+    }
28 28
 
29
-	/**
30
-	 * Create a new exception when the action's args cannot be decoded to an array.
31
-	 *
32
-	 * @author Jeremy Pry
33
-	 *
34
-	 * @param string $action_id The action ID with bad args.
35
-	 * @return static
36
-	 */
37
-	public static function from_decoding_args( $action_id, $args = array() ) {
38
-		$message = sprintf(
39
-			/* translators: 1: action ID 2: arguments */
40
-			__( 'Action [%1$s] has invalid arguments. It cannot be JSON decoded to an array. $args = %2$s', 'action-scheduler' ),
41
-			$action_id,
42
-			var_export( $args, true )
43
-		);
29
+    /**
30
+     * Create a new exception when the action's args cannot be decoded to an array.
31
+     *
32
+     * @author Jeremy Pry
33
+     *
34
+     * @param string $action_id The action ID with bad args.
35
+     * @return static
36
+     */
37
+    public static function from_decoding_args( $action_id, $args = array() ) {
38
+        $message = sprintf(
39
+            /* translators: 1: action ID 2: arguments */
40
+            __( 'Action [%1$s] has invalid arguments. It cannot be JSON decoded to an array. $args = %2$s', 'action-scheduler' ),
41
+            $action_id,
42
+            var_export( $args, true )
43
+        );
44 44
 
45
-		return new static( $message );
46
-	}
45
+        return new static( $message );
46
+    }
47 47
 }
Please login to merge, or discard this patch.
includes/libraries/action-scheduler/classes/ActionScheduler_Versions.php 1 patch
Indentation   +55 added lines, -55 removed lines patch added patch discarded remove patch
@@ -4,59 +4,59 @@
 block discarded – undo
4 4
  * Class ActionScheduler_Versions
5 5
  */
6 6
 class ActionScheduler_Versions {
7
-	/**
8
-	 * @var ActionScheduler_Versions
9
-	 */
10
-	private static $instance = NULL;
11
-
12
-	private $versions = array();
13
-
14
-	public function register( $version_string, $initialization_callback ) {
15
-		if ( isset($this->versions[$version_string]) ) {
16
-			return FALSE;
17
-		}
18
-		$this->versions[$version_string] = $initialization_callback;
19
-		return TRUE;
20
-	}
21
-
22
-	public function get_versions() {
23
-		return $this->versions;
24
-	}
25
-
26
-	public function latest_version() {
27
-		$keys = array_keys($this->versions);
28
-		if ( empty($keys) ) {
29
-			return false;
30
-		}
31
-		uasort( $keys, 'version_compare' );
32
-		return end($keys);
33
-	}
34
-
35
-	public function latest_version_callback() {
36
-		$latest = $this->latest_version();
37
-		if ( empty($latest) || !isset($this->versions[$latest]) ) {
38
-			return '__return_null';
39
-		}
40
-		return $this->versions[$latest];
41
-	}
42
-
43
-	/**
44
-	 * @return ActionScheduler_Versions
45
-	 * @codeCoverageIgnore
46
-	 */
47
-	public static function instance() {
48
-		if ( empty(self::$instance) ) {
49
-			self::$instance = new self();
50
-		}
51
-		return self::$instance;
52
-	}
53
-
54
-	/**
55
-	 * @codeCoverageIgnore
56
-	 */
57
-	public static function initialize_latest_version() {
58
-		$self = self::instance();
59
-		call_user_func($self->latest_version_callback());
60
-	}
7
+    /**
8
+     * @var ActionScheduler_Versions
9
+     */
10
+    private static $instance = NULL;
11
+
12
+    private $versions = array();
13
+
14
+    public function register( $version_string, $initialization_callback ) {
15
+        if ( isset($this->versions[$version_string]) ) {
16
+            return FALSE;
17
+        }
18
+        $this->versions[$version_string] = $initialization_callback;
19
+        return TRUE;
20
+    }
21
+
22
+    public function get_versions() {
23
+        return $this->versions;
24
+    }
25
+
26
+    public function latest_version() {
27
+        $keys = array_keys($this->versions);
28
+        if ( empty($keys) ) {
29
+            return false;
30
+        }
31
+        uasort( $keys, 'version_compare' );
32
+        return end($keys);
33
+    }
34
+
35
+    public function latest_version_callback() {
36
+        $latest = $this->latest_version();
37
+        if ( empty($latest) || !isset($this->versions[$latest]) ) {
38
+            return '__return_null';
39
+        }
40
+        return $this->versions[$latest];
41
+    }
42
+
43
+    /**
44
+     * @return ActionScheduler_Versions
45
+     * @codeCoverageIgnore
46
+     */
47
+    public static function instance() {
48
+        if ( empty(self::$instance) ) {
49
+            self::$instance = new self();
50
+        }
51
+        return self::$instance;
52
+    }
53
+
54
+    /**
55
+     * @codeCoverageIgnore
56
+     */
57
+    public static function initialize_latest_version() {
58
+        $self = self::instance();
59
+        call_user_func($self->latest_version_callback());
60
+    }
61 61
 }
62
- 
63 62
\ No newline at end of file
63
+    
64 64
\ No newline at end of file
Please login to merge, or discard this patch.
action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php 1 patch
Indentation   +232 added lines, -232 removed lines patch added patch discarded remove patch
@@ -5,236 +5,236 @@
 block discarded – undo
5 5
  */
6 6
 abstract class ActionScheduler_Abstract_QueueRunner extends ActionScheduler_Abstract_QueueRunner_Deprecated {
7 7
 
8
-	/** @var ActionScheduler_QueueCleaner */
9
-	protected $cleaner;
10
-
11
-	/** @var ActionScheduler_FatalErrorMonitor */
12
-	protected $monitor;
13
-
14
-	/** @var ActionScheduler_Store */
15
-	protected $store;
16
-
17
-	/**
18
-	 * The created time.
19
-	 *
20
-	 * Represents when the queue runner was constructed and used when calculating how long a PHP request has been running.
21
-	 * For this reason it should be as close as possible to the PHP request start time.
22
-	 *
23
-	 * @var int
24
-	 */
25
-	private $created_time;
26
-
27
-	/**
28
-	 * ActionScheduler_Abstract_QueueRunner constructor.
29
-	 *
30
-	 * @param ActionScheduler_Store             $store
31
-	 * @param ActionScheduler_FatalErrorMonitor $monitor
32
-	 * @param ActionScheduler_QueueCleaner      $cleaner
33
-	 */
34
-	public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) {
35
-
36
-		$this->created_time = microtime( true );
37
-
38
-		$this->store   = $store ? $store : ActionScheduler_Store::instance();
39
-		$this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor( $this->store );
40
-		$this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner( $this->store );
41
-	}
42
-
43
-	/**
44
-	 * Process an individual action.
45
-	 *
46
-	 * @param int $action_id The action ID to process.
47
-	 * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron'
48
-	 *        Generally, this should be capitalised and not localised as it's a proper noun.
49
-	 */
50
-	public function process_action( $action_id, $context = '' ) {
51
-		try {
52
-			$valid_action = false;
53
-			do_action( 'action_scheduler_before_execute', $action_id, $context );
54
-
55
-			if ( ActionScheduler_Store::STATUS_PENDING !== $this->store->get_status( $action_id ) ) {
56
-				do_action( 'action_scheduler_execution_ignored', $action_id, $context );
57
-				return;
58
-			}
59
-
60
-			$valid_action = true;
61
-			do_action( 'action_scheduler_begin_execute', $action_id, $context );
62
-
63
-			$action = $this->store->fetch_action( $action_id );
64
-			$this->store->log_execution( $action_id );
65
-			$action->execute();
66
-			do_action( 'action_scheduler_after_execute', $action_id, $action, $context );
67
-			$this->store->mark_complete( $action_id );
68
-		} catch ( Exception $e ) {
69
-			if ( $valid_action ) {
70
-				$this->store->mark_failure( $action_id );
71
-				do_action( 'action_scheduler_failed_execution', $action_id, $e, $context );
72
-			} else {
73
-				do_action( 'action_scheduler_failed_validation', $action_id, $e, $context );
74
-			}
75
-		}
76
-
77
-		if ( isset( $action ) && is_a( $action, 'ActionScheduler_Action' ) && $action->get_schedule()->is_recurring() ) {
78
-			$this->schedule_next_instance( $action, $action_id );
79
-		}
80
-	}
81
-
82
-	/**
83
-	 * Schedule the next instance of the action if necessary.
84
-	 *
85
-	 * @param ActionScheduler_Action $action
86
-	 * @param int $action_id
87
-	 */
88
-	protected function schedule_next_instance( ActionScheduler_Action $action, $action_id ) {
89
-		try {
90
-			ActionScheduler::factory()->repeat( $action );
91
-		} catch ( Exception $e ) {
92
-			do_action( 'action_scheduler_failed_to_schedule_next_instance', $action_id, $e, $action );
93
-		}
94
-	}
95
-
96
-	/**
97
-	 * Run the queue cleaner.
98
-	 *
99
-	 * @author Jeremy Pry
100
-	 */
101
-	protected function run_cleanup() {
102
-		$this->cleaner->clean( 10 * $this->get_time_limit() );
103
-	}
104
-
105
-	/**
106
-	 * Get the number of concurrent batches a runner allows.
107
-	 *
108
-	 * @return int
109
-	 */
110
-	public function get_allowed_concurrent_batches() {
111
-		return apply_filters( 'action_scheduler_queue_runner_concurrent_batches', 1 );
112
-	}
113
-
114
-	/**
115
-	 * Check if the number of allowed concurrent batches is met or exceeded.
116
-	 *
117
-	 * @return bool
118
-	 */
119
-	public function has_maximum_concurrent_batches() {
120
-		return $this->store->get_claim_count() >= $this->get_allowed_concurrent_batches();
121
-	}
122
-
123
-	/**
124
-	 * Get the maximum number of seconds a batch can run for.
125
-	 *
126
-	 * @return int The number of seconds.
127
-	 */
128
-	protected function get_time_limit() {
129
-
130
-		$time_limit = 30;
131
-
132
-		// Apply deprecated filter from deprecated get_maximum_execution_time() method
133
-		if ( has_filter( 'action_scheduler_maximum_execution_time' ) ) {
134
-			_deprecated_function( 'action_scheduler_maximum_execution_time', '2.1.1', 'action_scheduler_queue_runner_time_limit' );
135
-			$time_limit = apply_filters( 'action_scheduler_maximum_execution_time', $time_limit );
136
-		}
137
-
138
-		return absint( apply_filters( 'action_scheduler_queue_runner_time_limit', $time_limit ) );
139
-	}
140
-
141
-	/**
142
-	 * Get the number of seconds the process has been running.
143
-	 *
144
-	 * @return int The number of seconds.
145
-	 */
146
-	protected function get_execution_time() {
147
-		$execution_time = microtime( true ) - $this->created_time;
148
-
149
-		// Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time.
150
-		if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) {
151
-			$resource_usages = getrusage();
152
-
153
-			if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) {
154
-				$execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 );
155
-			}
156
-		}
157
-
158
-		return $execution_time;
159
-	}
160
-
161
-	/**
162
-	 * Check if the host's max execution time is (likely) to be exceeded if processing more actions.
163
-	 *
164
-	 * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action
165
-	 * @return bool
166
-	 */
167
-	protected function time_likely_to_be_exceeded( $processed_actions ) {
168
-
169
-		$execution_time        = $this->get_execution_time();
170
-		$max_execution_time    = $this->get_time_limit();
171
-		$time_per_action       = $execution_time / $processed_actions;
172
-		$estimated_time        = $execution_time + ( $time_per_action * 3 );
173
-		$likely_to_be_exceeded = $estimated_time > $max_execution_time;
174
-
175
-		return apply_filters( 'action_scheduler_maximum_execution_time_likely_to_be_exceeded', $likely_to_be_exceeded, $this, $processed_actions, $execution_time, $max_execution_time );
176
-	}
177
-
178
-	/**
179
-	 * Get memory limit
180
-	 *
181
-	 * Based on WP_Background_Process::get_memory_limit()
182
-	 *
183
-	 * @return int
184
-	 */
185
-	protected function get_memory_limit() {
186
-		if ( function_exists( 'ini_get' ) ) {
187
-			$memory_limit = ini_get( 'memory_limit' );
188
-		} else {
189
-			$memory_limit = '128M'; // Sensible default, and minimum required by WooCommerce
190
-		}
191
-
192
-		if ( ! $memory_limit || -1 === $memory_limit || '-1' === $memory_limit ) {
193
-			// Unlimited, set to 32GB.
194
-			$memory_limit = '32G';
195
-		}
196
-
197
-		return ActionScheduler_Compatibility::convert_hr_to_bytes( $memory_limit );
198
-	}
199
-
200
-	/**
201
-	 * Memory exceeded
202
-	 *
203
-	 * Ensures the batch process never exceeds 90% of the maximum WordPress memory.
204
-	 *
205
-	 * Based on WP_Background_Process::memory_exceeded()
206
-	 *
207
-	 * @return bool
208
-	 */
209
-	protected function memory_exceeded() {
210
-
211
-		$memory_limit    = $this->get_memory_limit() * 0.90;
212
-		$current_memory  = memory_get_usage( true );
213
-		$memory_exceeded = $current_memory >= $memory_limit;
214
-
215
-		return apply_filters( 'action_scheduler_memory_exceeded', $memory_exceeded, $this );
216
-	}
217
-
218
-	/**
219
-	 * See if the batch limits have been exceeded, which is when memory usage is almost at
220
-	 * the maximum limit, or the time to process more actions will exceed the max time limit.
221
-	 *
222
-	 * Based on WC_Background_Process::batch_limits_exceeded()
223
-	 *
224
-	 * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action
225
-	 * @return bool
226
-	 */
227
-	protected function batch_limits_exceeded( $processed_actions ) {
228
-		return $this->memory_exceeded() || $this->time_likely_to_be_exceeded( $processed_actions );
229
-	}
230
-
231
-	/**
232
-	 * Process actions in the queue.
233
-	 *
234
-	 * @author Jeremy Pry
235
-	 * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron'
236
-	 *        Generally, this should be capitalised and not localised as it's a proper noun.
237
-	 * @return int The number of actions processed.
238
-	 */
239
-	abstract public function run( $context = '' );
8
+    /** @var ActionScheduler_QueueCleaner */
9
+    protected $cleaner;
10
+
11
+    /** @var ActionScheduler_FatalErrorMonitor */
12
+    protected $monitor;
13
+
14
+    /** @var ActionScheduler_Store */
15
+    protected $store;
16
+
17
+    /**
18
+     * The created time.
19
+     *
20
+     * Represents when the queue runner was constructed and used when calculating how long a PHP request has been running.
21
+     * For this reason it should be as close as possible to the PHP request start time.
22
+     *
23
+     * @var int
24
+     */
25
+    private $created_time;
26
+
27
+    /**
28
+     * ActionScheduler_Abstract_QueueRunner constructor.
29
+     *
30
+     * @param ActionScheduler_Store             $store
31
+     * @param ActionScheduler_FatalErrorMonitor $monitor
32
+     * @param ActionScheduler_QueueCleaner      $cleaner
33
+     */
34
+    public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) {
35
+
36
+        $this->created_time = microtime( true );
37
+
38
+        $this->store   = $store ? $store : ActionScheduler_Store::instance();
39
+        $this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor( $this->store );
40
+        $this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner( $this->store );
41
+    }
42
+
43
+    /**
44
+     * Process an individual action.
45
+     *
46
+     * @param int $action_id The action ID to process.
47
+     * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron'
48
+     *        Generally, this should be capitalised and not localised as it's a proper noun.
49
+     */
50
+    public function process_action( $action_id, $context = '' ) {
51
+        try {
52
+            $valid_action = false;
53
+            do_action( 'action_scheduler_before_execute', $action_id, $context );
54
+
55
+            if ( ActionScheduler_Store::STATUS_PENDING !== $this->store->get_status( $action_id ) ) {
56
+                do_action( 'action_scheduler_execution_ignored', $action_id, $context );
57
+                return;
58
+            }
59
+
60
+            $valid_action = true;
61
+            do_action( 'action_scheduler_begin_execute', $action_id, $context );
62
+
63
+            $action = $this->store->fetch_action( $action_id );
64
+            $this->store->log_execution( $action_id );
65
+            $action->execute();
66
+            do_action( 'action_scheduler_after_execute', $action_id, $action, $context );
67
+            $this->store->mark_complete( $action_id );
68
+        } catch ( Exception $e ) {
69
+            if ( $valid_action ) {
70
+                $this->store->mark_failure( $action_id );
71
+                do_action( 'action_scheduler_failed_execution', $action_id, $e, $context );
72
+            } else {
73
+                do_action( 'action_scheduler_failed_validation', $action_id, $e, $context );
74
+            }
75
+        }
76
+
77
+        if ( isset( $action ) && is_a( $action, 'ActionScheduler_Action' ) && $action->get_schedule()->is_recurring() ) {
78
+            $this->schedule_next_instance( $action, $action_id );
79
+        }
80
+    }
81
+
82
+    /**
83
+     * Schedule the next instance of the action if necessary.
84
+     *
85
+     * @param ActionScheduler_Action $action
86
+     * @param int $action_id
87
+     */
88
+    protected function schedule_next_instance( ActionScheduler_Action $action, $action_id ) {
89
+        try {
90
+            ActionScheduler::factory()->repeat( $action );
91
+        } catch ( Exception $e ) {
92
+            do_action( 'action_scheduler_failed_to_schedule_next_instance', $action_id, $e, $action );
93
+        }
94
+    }
95
+
96
+    /**
97
+     * Run the queue cleaner.
98
+     *
99
+     * @author Jeremy Pry
100
+     */
101
+    protected function run_cleanup() {
102
+        $this->cleaner->clean( 10 * $this->get_time_limit() );
103
+    }
104
+
105
+    /**
106
+     * Get the number of concurrent batches a runner allows.
107
+     *
108
+     * @return int
109
+     */
110
+    public function get_allowed_concurrent_batches() {
111
+        return apply_filters( 'action_scheduler_queue_runner_concurrent_batches', 1 );
112
+    }
113
+
114
+    /**
115
+     * Check if the number of allowed concurrent batches is met or exceeded.
116
+     *
117
+     * @return bool
118
+     */
119
+    public function has_maximum_concurrent_batches() {
120
+        return $this->store->get_claim_count() >= $this->get_allowed_concurrent_batches();
121
+    }
122
+
123
+    /**
124
+     * Get the maximum number of seconds a batch can run for.
125
+     *
126
+     * @return int The number of seconds.
127
+     */
128
+    protected function get_time_limit() {
129
+
130
+        $time_limit = 30;
131
+
132
+        // Apply deprecated filter from deprecated get_maximum_execution_time() method
133
+        if ( has_filter( 'action_scheduler_maximum_execution_time' ) ) {
134
+            _deprecated_function( 'action_scheduler_maximum_execution_time', '2.1.1', 'action_scheduler_queue_runner_time_limit' );
135
+            $time_limit = apply_filters( 'action_scheduler_maximum_execution_time', $time_limit );
136
+        }
137
+
138
+        return absint( apply_filters( 'action_scheduler_queue_runner_time_limit', $time_limit ) );
139
+    }
140
+
141
+    /**
142
+     * Get the number of seconds the process has been running.
143
+     *
144
+     * @return int The number of seconds.
145
+     */
146
+    protected function get_execution_time() {
147
+        $execution_time = microtime( true ) - $this->created_time;
148
+
149
+        // Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time.
150
+        if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) {
151
+            $resource_usages = getrusage();
152
+
153
+            if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) {
154
+                $execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 );
155
+            }
156
+        }
157
+
158
+        return $execution_time;
159
+    }
160
+
161
+    /**
162
+     * Check if the host's max execution time is (likely) to be exceeded if processing more actions.
163
+     *
164
+     * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action
165
+     * @return bool
166
+     */
167
+    protected function time_likely_to_be_exceeded( $processed_actions ) {
168
+
169
+        $execution_time        = $this->get_execution_time();
170
+        $max_execution_time    = $this->get_time_limit();
171
+        $time_per_action       = $execution_time / $processed_actions;
172
+        $estimated_time        = $execution_time + ( $time_per_action * 3 );
173
+        $likely_to_be_exceeded = $estimated_time > $max_execution_time;
174
+
175
+        return apply_filters( 'action_scheduler_maximum_execution_time_likely_to_be_exceeded', $likely_to_be_exceeded, $this, $processed_actions, $execution_time, $max_execution_time );
176
+    }
177
+
178
+    /**
179
+     * Get memory limit
180
+     *
181
+     * Based on WP_Background_Process::get_memory_limit()
182
+     *
183
+     * @return int
184
+     */
185
+    protected function get_memory_limit() {
186
+        if ( function_exists( 'ini_get' ) ) {
187
+            $memory_limit = ini_get( 'memory_limit' );
188
+        } else {
189
+            $memory_limit = '128M'; // Sensible default, and minimum required by WooCommerce
190
+        }
191
+
192
+        if ( ! $memory_limit || -1 === $memory_limit || '-1' === $memory_limit ) {
193
+            // Unlimited, set to 32GB.
194
+            $memory_limit = '32G';
195
+        }
196
+
197
+        return ActionScheduler_Compatibility::convert_hr_to_bytes( $memory_limit );
198
+    }
199
+
200
+    /**
201
+     * Memory exceeded
202
+     *
203
+     * Ensures the batch process never exceeds 90% of the maximum WordPress memory.
204
+     *
205
+     * Based on WP_Background_Process::memory_exceeded()
206
+     *
207
+     * @return bool
208
+     */
209
+    protected function memory_exceeded() {
210
+
211
+        $memory_limit    = $this->get_memory_limit() * 0.90;
212
+        $current_memory  = memory_get_usage( true );
213
+        $memory_exceeded = $current_memory >= $memory_limit;
214
+
215
+        return apply_filters( 'action_scheduler_memory_exceeded', $memory_exceeded, $this );
216
+    }
217
+
218
+    /**
219
+     * See if the batch limits have been exceeded, which is when memory usage is almost at
220
+     * the maximum limit, or the time to process more actions will exceed the max time limit.
221
+     *
222
+     * Based on WC_Background_Process::batch_limits_exceeded()
223
+     *
224
+     * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action
225
+     * @return bool
226
+     */
227
+    protected function batch_limits_exceeded( $processed_actions ) {
228
+        return $this->memory_exceeded() || $this->time_likely_to_be_exceeded( $processed_actions );
229
+    }
230
+
231
+    /**
232
+     * Process actions in the queue.
233
+     *
234
+     * @author Jeremy Pry
235
+     * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron'
236
+     *        Generally, this should be capitalised and not localised as it's a proper noun.
237
+     * @return int The number of actions processed.
238
+     */
239
+    abstract public function run( $context = '' );
240 240
 }
Please login to merge, or discard this patch.