php-shellcommand provides a simple object oriented interface to execute shell commands.
Your php version must be 5.4
or later.
This package can be installed easily using composer.
composer install mikehaertl/php-shellcommand
- Catches
stdOut
,stdErr
andexitCode
- Handle argument escaping
- Pass environment vars and other options to
proc_open()
<?php
use mikehaertl\shellcommand\Command;
// Basic example
$command = new Command('/usr/local/bin/mycommand -a -b');
if ($command->execute()) {
echo $command->getOutput();
} else {
echo $command->getError();
$exitCode = $command->getExitCode();
}
// Create command with options array
$command = new Command(array(
'command' => '/usr/local/bin/mycommand',
// Will be passed as environment variables to the command
'procEnv' => array(
'DEMOVAR' => 'demovalue'
),
// Will be passed as options to proc_open()
'procOptions' => array(
'bypass_shell' => true,
),
));
// Add arguments with correct escaping:
// results in --name='d'\''Artagnan'
$command->addArg('--name=', "d'Artagnan");
// Add argument with several values
// results in --keys key1 key2
$command->addArg('--keys', array('key1','key2'));
// Add string to pipe to command on standard input
$command->setStdIn('string');
$escapeArgs
: Whether to escape any argument passed throughaddArg()
. Default istrue
.$escapeCommand
: Whether to escape the command passed tosetCommand()
or the constructor. This is only useful if$escapeArgs
isfalse
. Default isfalse
.$useExec
: Whether to useexec()
instead ofproc_open()
. This is a workaround for OS which have problems withproc_open()
. Default isfalse
.$captureStdErr
: Whether to capture stderr whenuseExec
is set. This will try to redirect the otherwhise unavailablestderr
tostdout
, so that both have the same content on error. Default istrue
.$procCwd
: The initial working dir passed toproc_open()
. Default isnull
for current PHP working dir.$procEnv
: An array with environment variables to pass toproc_open()
. Default isnull
for none.$procOptions
: An array ofother_options
forproc_open()
. Default isnull
for none.$locale
: The locale to (temporarily) set withsetlocale()
before running the command. This can be set to e.g.en_US.UTF-8
if you have issues with UTF-8 encoded arguments.
You can configure all these properties via an array that you pass in the constructor. You can also
pass command
, execCommand
and args
as options. This will call the respective setter (setCommand()
,
setExecCommand()
, etc.).
__construct($options = null)
$options
: either a command string or an options array (seesetOptions()
)
setOptions($options)
: Set command options$options
: array of name => value options that should be applied to the object. You can also pass options that use a setter, e.g. you can pass acommand
option which will be passed tosetCommand().
setCommand($command)
: Set command$command
: The command or full command string to execute, likegzip
orgzip -d
. You can still calladdArg()
to add more arguments to the command. If$escapeCommand
was set totrue
, the command gets escaped throughescapeshellcmd()
.
getCommand()
: The command that was set throughsetCommand()
or passed to the constructor.getExecCommand()
: The full command string to execute.setArgs($args)
: Set argument as string$args
: The command arguments as string. Note, that these will not get escaped!
getArgs()
: The command arguments that where set throughsetArgs()
oraddArg()
, as stringaddArg($key, $value=null, $escape=null)
: Add argument with correct escaping$key
: The argument key to add e.g.--feature
or--name=
. If the key does not end with and=
, the$value
will be separated by a space, if any. Keys are not escaped unless$value
is null and$escape
istrue
.$value
: The optional argument value which will get escaped if$escapeArgs
is true. An array can be passed to add more than one value for a key, e.g.addArg('--exclude', array('val1','val2'))
which will create the option "--exclude 'val1' 'val2'".$escape
: If set, this overrides the$escapeArgs
setting and enforces escaping/no escaping
setStdIn()
: String or resource to supply to command via standard input.getOutput()
: The command output as string. Empty if none.getError()
: The error message, either stderr or internal message. Empty if no error.getStdErr()
: The stderr output. Empty if none.getExitCode()
: The exit code.getExecuted()
: Whether the command was successfully executed.execute()
: Executes the command and returnstrue
on success,false
otherwhise.
Note:
getError()
,getStdErr()
andgetOutput()
return the trimmed output. You can passfalse
to these methods if you need any possible line breaks at the end.