mikehaertl/php-shellcommand

面向对象的shell命令接口

1.7.0 2023-04-19 08:25 UTC

README

GitHub Tests Packagist Version Packagist Downloads GitHub license Packagist PHP Version Support

php-shellcommand提供了一个简单面向对象的接口来执行shell命令。

安装

先决条件

您的PHP版本必须是5.4或更高。

使用Composer安装

此包可以使用Composer轻松安装。

composer require mikehaertl/php-shellcommand

特性

  • 捕获stdOutstdErrexitCode
  • 处理参数转义
  • 将环境变量和其他选项传递给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()或构造函数的命令进行转义。这仅在$escapeArgsfalse时有用。默认值为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系统上启用此功能。将值设置为truefalse以手动启用/禁用此功能。请注意,它不支持Windows。
  • $timeout:在命令被终止之前经过的秒数。这仅在非阻塞模式下有效。默认值为null,表示进程永远不会被终止。
  • $locale:使用setlocale()在运行命令之前(临时)设置的区域设置。如果您在UTF-8编码的参数方面有问题,可以将此设置为例如en_US.UTF-8

您可以通过传递到构造函数的数组来配置所有这些属性。您还可以将commandexecCommandargs作为选项传递。这将调用相应的设置器(setCommand()setExecCommand()等)。

方法

  • __construct($options = null)
    • $options:要么是一个命令字符串,要么是一个选项数组(见setOptions()
  • __toString():来自getExecCommand()的结果
  • setOptions($options):设置命令选项
    • $options:应用到此对象的名称=>值选项数组。您还可以传递使用设置器的选项,例如,您可以传递一个command选项,该选项将被传递到setCommand().
  • setCommand($command):设置命令
    • $command:要执行的命令或完整的命令字符串,例如gzipgzip -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将通过空格分离。如果$escapeArgstrue,则键将进行转义。
    • $value:可选的参数值,如果$escapeArgstrue,则进行转义。可以传递数组以为键添加多个值,例如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