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。