public static function runcommand($command, $options = array())
{
$defaults = array('launch' => true, 'exit_error' => true, 'return' => false, 'parse' => false);
$options = array_merge($defaults, $options);
$launch = $options['launch'];
$exit_error = $options['exit_error'];
$return = $options['return'];
$parse = $options['parse'];
$retval = null;
if ($launch) {
if ($return) {
$descriptors = array(0 => STDIN, 1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
} else {
$descriptors = array(0 => STDIN, 1 => STDOUT, 2 => STDERR);
}
$php_bin = self::get_php_binary();
$script_path = $GLOBALS['argv'][0];
// Persist runtime arguments unless they've been specified otherwise.
$configurator = \WP_CLI::get_configurator();
$argv = array_slice($GLOBALS['argv'], 1);
list($_, $_, $runtime_config) = $configurator->parse_args($argv);
foreach ($runtime_config as $k => $v) {
if (preg_match("|^--{$key}=?\$|", $command)) {
unset($runtime_config[$k]);
}
}
$runtime_config = Utils\assoc_args_to_str($runtime_config);
$runcommand = "{$php_bin} {$script_path} {$runtime_config} {$command}";
$env_vars = array('HOME', 'WP_CLI_AUTO_CHECK_UPDATE_DAYS', 'WP_CLI_CACHE_DIR', 'WP_CLI_CONFIG_PATH', 'WP_CLI_DISABLE_AUTO_CHECK_UPDATE', 'WP_CLI_PACKAGES_DIR', 'WP_CLI_PHP_USED', 'WP_CLI_PHP', 'WP_CLI_STRICT_ARGS_MODE');
$env = array();
foreach ($env_vars as $var) {
$env[$var] = getenv($var);
}
$proc = proc_open($runcommand, $descriptors, $pipes, getcwd(), $env);
if ($return) {
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
}
$return_code = proc_close($proc);
if (-1 == $return_code) {
self::warning("Spawned process returned exit code -1, which could be caused by a custom compiled version of PHP that uses the --enable-sigchild option.");
} else {
if ($return_code && $exit_error) {
exit($return_code);
}
}
if (true === $return || 'stdout' === $return) {
$retval = trim($stdout);
} else {
if ('stderr' === $return) {
$retval = trim($stderr);
} else {
if ('return_code' === $return) {
$retval = $return_code;
} else {
if ('all' === $return) {
$retval = (object) array('stdout' => trim($stdout), 'stderr' => trim($stderr), 'return_code' => $return_code);
}
}
}
}
} else {
$configurator = self::get_configurator();
$argv = Utils\parse_str_to_argv($command);
list($args, $assoc_args, $runtime_config) = $configurator->parse_args($argv);
if ($return) {
ob_start();
$existing_logger = self::$logger;
self::$logger = new WP_CLI\Loggers\Execution();
}
if (!$exit_error) {
self::$capture_exit = true;
}
try {
self::get_runner()->run_command($args, $assoc_args, array('back_compat_conversions' => true));
$return_code = 0;
} catch (ExitException $e) {
$return_code = $e->getCode();
}
if ($return) {
$execution_logger = self::$logger;
self::$logger = $existing_logger;
$stdout = trim(ob_get_clean());
$stderr = $execution_logger->stderr;
if (true === $return || 'stdout' === $return) {
$retval = trim($stdout);
} else {
if ('stderr' === $return) {
$retval = trim($stderr);
} else {
if ('return_code' === $return) {
$retval = $return_code;
} else {
if ('all' === $return) {
$retval = (object) array('stdout' => trim($stdout), 'stderr' => trim($stderr), 'return_code' => $return_code);
}
}
}
}
}
if (!$exit_error) {
self::$capture_exit = false;
}
}
if ((true === $return || 'stdout' === $return) && 'json' === $parse) {
$retval = json_decode($retval, true);
}
return $retval;
}