mikehaertl / php-shellcommand
面向对象的shell命令接口
1.7.0
2023-04-19 08:25 UTC
Requires
- php: >= 5.3.0
Requires (Dev)
- phpunit/phpunit: >4.0 <=9.4
README
php-shellcommand提供了一个简单面向对象的接口来执行shell命令。
安装
先决条件
您的PHP版本必须是5.4或更高。
使用Composer安装
此包可以使用Composer轻松安装。
composer require mikehaertl/php-shellcommand
特性
- 捕获
stdOut
、stdErr
和exitCode
- 处理参数转义
- 将环境变量和其他选项传递给
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(); }
高级特性
添加参数
<?php $command = new Command('/bin/somecommand'); // 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', ['key1','key2']);
将输入管道化到命令中
从字符串
<?php $command = new ('jq'); // jq is a pretty printer $command->setStdIn('{"foo": 0}'); if (!$command->execute()) { echo $command->getError(); } else { echo $command->getOutput(); } // Output: // { // "foo": 0 // }
从文件
<?php $fh = fopen('test.json', 'r'); // error checks left out... $command = new Command('jq'); $command->setStdIn($fh); if (!$command->execute()) { echo $command->getError(); } else { echo $command->getOutput(); } fclose($fh);
从URL
<?php $fh = fopen('https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m,relativehumidity_2m,windspeed_10m', 'r'); // error checks left out... $command = new Command('jq'); $command->setStdIn($fh); if (!$command->execute()) { echo $command->getError(); } else { echo $command->getOutput(); } fclose($fh);
设置命令实例选项
<?php // Create command with options array $command = new Command([ 'command' => '/usr/local/bin/mycommand', // Will be passed as environment variables to the command 'procEnv' => [ 'DEMOVAR' => 'demovalue' ], // Will be passed as options to proc_open() 'procOptions' => [ 'bypass_shell' => true, ], ]);
API
属性
$escapeArgs
:是否对通过addArg()
传递的任何参数进行转义。默认值为true
。$escapeCommand
:是否对传递给setCommand()
或构造函数的命令进行转义。这仅在$escapeArgs
为false
时有用。默认值为false
。$useExec
:是否使用exec()
而不是proc_open()
。这是针对那些与proc_open()
存在问题的操作系统的一种解决方案。默认值为false
。$captureStdErr
:当useExec
被设置时,是否捕获stderr。这将尝试将其他情况下不可用的stderr
重定向到stdout
,以便在错误时两者具有相同的内容。默认值为true
。$procCwd
:传递给proc_open()
的初始工作目录。默认值为null
,表示当前PHP工作目录。$procEnv
:传递给proc_open()
的环境变量数组。默认值为null
,表示没有传递任何环境变量。$procOptions
:传递给proc_open()
的其他选项数组。默认值为null
,表示没有传递任何其他选项。$nonBlockingMode
:当使用proc_open()
时,是否将stdin、stdout、stderr流设置为非阻塞模式。这允许在不使进程挂起的情况下处理巨大的输入/输出。默认值为null
,表示在非Windows系统上启用此功能。将值设置为true
或false
以手动启用/禁用此功能。请注意,它不支持Windows。$timeout
:在命令被终止之前经过的秒数。这仅在非阻塞模式下有效。默认值为null
,表示进程永远不会被终止。$locale
:使用setlocale()
在运行命令之前(临时)设置的区域设置。如果您在UTF-8编码的参数方面有问题,可以将此设置为例如en_US.UTF-8
。
您可以通过传递到构造函数的数组来配置所有这些属性。您还可以将command
、execCommand
和args
作为选项传递。这将调用相应的设置器(setCommand()
、setExecCommand()
等)。
方法
__construct($options = null)
$options
:要么是一个命令字符串,要么是一个选项数组(见setOptions()
)
__toString()
:来自getExecCommand()
的结果setOptions($options)
:设置命令选项$options
:应用到此对象的名称=>值选项数组。您还可以传递使用设置器的选项,例如,您可以传递一个command
选项,该选项将被传递到setCommand().
setCommand($command)
:设置命令$command
:要执行的命令或完整的命令字符串,例如gzip
或gzip -d
。您仍然可以调用addArg()
向命令添加更多参数。如果$escapeCommand
设置为true
,则命令将通过escapeshellcmd()
进行转义。
getCommand()
:通过setCommand()
设置的命令或传递给构造函数的命令。getExecCommand()
:要执行的完整命令字符串。setArgs($args)
:将参数设置为字符串$args
:命令参数作为字符串。注意,这些参数不会进行转义。这将覆盖使用addArgs()
添加的参数。
getArgs()
:通过setArgs()
或addArg()
设置的命令参数,作为字符串addArg($key, $value=null, $escape=null)
:添加具有正确转义的参数$key
:要添加的参数键,例如--feature
或--name=
。如果键不以=
结尾,则(可选的)$value
将通过空格分离。如果$escapeArgs
为true
,则键将进行转义。$value
:可选的参数值,如果$escapeArgs
为true
,则进行转义。可以传递数组以为键添加多个值,例如addArg('--exclude', ['val1','val2'])
,这将创建选项"--exclude 'val1' 'val2'"。$escape
:如果设置,则覆盖$escapeArgs
设置并强制转义/不转义
setStdIn()
:要命令通过标准输入提供的字符串或资源。这启用了与命令行上的管道相同的函数。它也可以是文件句柄或流等资源,在这种情况下,其内容将像输入重定向一样被管道传输到命令中。getOutput()
:命令输出作为字符串。如果没有输出则为空。getError()
:错误消息,可以是stderr或内部消息。如果没有错误则为空。getStdErr()
:stderr输出。如果没有输出则为空。getExitCode()
:退出代码或null
(如果未执行命令)。getExecuted()
:命令是否成功执行。getIsWindows()
:我们是否在Windows操作系统上。execute()
:执行命令并返回true
(成功)或false
(其他情况)。
注意:
getError()
、getStdErr()
和getOutput()
返回的是经过修剪的输出。如果您需要末尾可能有任何可能的换行符,可以向这些方法传递false
。