I need something like this in php:
If (!command_exists('makemiracle')) {
print 'no miracles';
return FALSE;
}
else {
// safely call the command knowing that it exists in the host system
shell_exec('makemiracle');
}
Are there any solutions?
On Linux/Mac OS Try this:
function command_exist($cmd) {
$return = shell_exec(sprintf("which %s", escapeshellarg($cmd)));
return !empty($return);
}
Then use it in code:
if (!command_exist('makemiracle')) {
print 'no miracles';
} else {
shell_exec('makemiracle');
}
Update: As suggested by @camilo-martin you could simply use:
if (`which makemiracle`) {
shell_exec('makemiracle');
}
Windows uses where
, UNIX systems which
to allow to localize a command. Both will return an empty string in STDOUT if the command isn't found.
PHP_OS is currently WINNT for every supported Windows version by PHP.
So here a portable solution:
/**
* Determines if a command exists on the current environment
*
* @param string $command The command to check
* @return bool True if the command has been found ; otherwise, false.
*/
function command_exists ($command) {
$whereIsCommand = (PHP_OS == 'WINNT') ? 'where' : 'which';
$process = proc_open(
"$whereIsCommand $command",
array(
0 => array("pipe", "r"), //STDIN
1 => array("pipe", "w"), //STDOUT
2 => array("pipe", "w"), //STDERR
),
$pipes
);
if ($process !== false) {
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
return $stdout != '';
}
return false;
}
Based on @jcubic and that 'which' should be avoided, this is the cross platform I came up with:
function verifyCommand($command) :bool {
$windows = strpos(PHP_OS, 'WIN') === 0;
$test = $windows ? 'where' : 'command -v';
return is_executable(trim(shell_exec("$test $command")));
}
You could use is_executable to check whether it is executable, but you need to know the path of the command, which you could use which
command to get it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With