Skip to content
Snippets Groups Projects
run.php 2.22 KiB
Newer Older
Erick Hitter's avatar
Erick Hitter committed
<?php
Erick Hitter's avatar
Erick Hitter committed
/**
 * Execution handling
 *
 * @package WP_CLI_Cron_Control_Offload
 */
Erick Hitter's avatar
Erick Hitter committed

namespace Automattic\WP\WP_CLI_Cron_Control_Offload;

/**
 * Intended for non-interactive use, so all output ends up in the error log
Erick Hitter's avatar
Erick Hitter committed
 *
Erick Hitter's avatar
Erick Hitter committed
 * @param string $command WP-CLI command to execute.
Erick Hitter's avatar
Erick Hitter committed
 */
function run_event( $command ) {
Erick Hitter's avatar
Erick Hitter committed
	if ( ! defined( 'WP_CLI' ) || ! \WP_CLI ) {
Erick Hitter's avatar
Erick Hitter committed
		// TODO: reschedule at least once or twice.
Erick Hitter's avatar
Erick Hitter committed
		/* translators: 1: Plugin's prefix for log messages, 2. WP-CLI command that would have run */
		trigger_error( sprintf( __( '%1$s: Attempted to run event without WP-CLI loaded. (%2$s)', 'wp-cli-cron-control-offload' ), MESSAGE_PREFIX, var_export( $command, true ) ), E_USER_WARNING );
	if ( ! validate_command( $command ) ) {
Erick Hitter's avatar
Erick Hitter committed
		/* translators: 1: Plugin's prefix for log messages, 2. WP-CLI command that would have run */
		trigger_error( sprintf( __( '%1$s: Attempted to run blocked WP-CLI command. (%2$s)', 'wp-cli-cron-control-offload' ), MESSAGE_PREFIX, var_export( $command, true ) ), E_USER_WARNING );
Erick Hitter's avatar
Erick Hitter committed
	$start = microtime( true );

	$output = \WP_CLI::runcommand( $command, array(
Erick Hitter's avatar
Erick Hitter committed
		'exit_error' => false, // Don't kill the cron process if the WP-CLI command fails, otherwise we can't capture the error.
		'launch'     => true,  // Don't reuse as we're in cron context.
		'return'     => 'all', // We want STDERR and the exit code, in addition to STDOUT.
Erick Hitter's avatar
Erick Hitter committed
	$end = microtime( true );

Erick Hitter's avatar
Erick Hitter committed
	// Command failed.
	if ( ! is_object( $output ) || is_wp_error( $output ) ) {
Erick Hitter's avatar
Erick Hitter committed
		/* translators: 1: Plugin's prefix for log messages, 2. Command error that caused failure */
		trigger_error( sprintf( __( '%1$s: WP-CLI command failed. (%2$s)', 'wp-cli-cron-control-offload' ), MESSAGE_PREFIX, var_export( $command, true ) ), E_USER_WARNING );

		$message = is_wp_error( $output ) ? $output->get_error_message() : var_export( $output, true );
		trigger_error( $message, E_USER_WARNING );
Erick Hitter's avatar
Erick Hitter committed
	// On success, reformat response for logging.
Erick Hitter's avatar
Erick Hitter committed
	$output->command  = $command;
	$output->start    = $start;
	$output->end      = $end;
	$output->duration = $end - $start;

	$output = var_export( $output, true );
	$output = MESSAGE_PREFIX . ":\n{$output}";

	error_log( $output );
Erick Hitter's avatar
Erick Hitter committed
}
add_action( ACTION, __NAMESPACE__ . '\run_event' );