捕获/抑制 php exec 的所有输出,包括 stderr

2024-01-07

我想通过运行几个命令exec()但我不想在屏幕上输出任何内容。然而,我确实想保留输出,以便我可以在脚本运行时控制详细程度。

这是我的课程:

<?php
class System
{
    public function exec($command, array &$output = [])
    {
        $returnVar = null;
        exec($command, $output, $returnVar);
        return $returnVar;
    }
}

问题是,大多数应用程序都会将大量不相关的内容放入其中stderr,我似乎无法阻止。例如,这是运行的输出git clone通过它:

Cloning into '/tmp/directory'...
remote: Counting objects: 649, done.
remote: Compressing objects: 100% (119/119), done.
remote: Total 649 (delta 64), reused 0 (delta 0), pack-reused 506
Receiving objects: 100% (649/649), 136.33 KiB | 0 bytes/s, done.
Resolving deltas: 100% (288/288), done.
Checking connectivity... done.

我看到其他问题声称使用输出缓冲区可以工作,但它似乎不起作用

<?php
class System
{
    public function exec($command, array &$output = [])
    {
        $returnVar = null;
        ob_start();
        exec($command, $output, $returnVar);
        ob_end_clean();
        return $returnVar;
    }
}

这仍然会产生相同的结果。我can通过在命令中将 stderr 路由到 stdout 来解决问题,但这不仅使我无法区分 stdout 和 stderr,而且该应用程序设计为在 Windows 和 Linux 中运行,因此现在这是一团糟。

<?php
class System
{
    public function exec($command, array &$output = [])
    {
        $returnVar = null;

        // Is Windows
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            exec($command, $output, $returnVar);
            return $returnVar;
        }

        // Is not windows
        exec("({$command}) 2>&1", $output, $returnVar);
        return $returnVar;
    }
}

有没有办法分别捕获和抑制 stderr 和 stdout?

更新/回答示例

根据评论中 @hexasoft 的建议,我更新了我的方法,如下所示:

<?php
class System
{
    public function exec($command, &$stdOutput = '', &$stdError = '')
    {
        $process = proc_open(
            $command,
            [
                0 => ['pipe', 'r'],
                1 => ['pipe', 'w'],
                2 => ['pipe', 'w'],
            ],
            $pipes
        );

        if (!is_resource($process)) {
            throw new \RuntimeException('Could not create a valid process');
        }

        // This will prevent to program from continuing until the processes is complete
        // Note: exitcode is created on the final loop here
        $status = proc_get_status($process);
        while($status['running']) {
            $status = proc_get_status($process);
        }

        $stdOutput = stream_get_contents($pipes[1]);
        $stdError  = stream_get_contents($pipes[2]);

        proc_close($process);

        return $status['exitcode'];
    }
}

该技术提供了更高级的选项,包括异步进程。


Command proc_exec()允许使用管道处理 exec-ed 命令的文件描述符。

其功能是:proc_open ( string $cmd , array $descriptorspec , array &$pipes […optional parameters] ) : resource

你在 $cmd 中给你命令(如exec),并给出一个描述要“安装”命令的文件描述符的数组。该数组按文件描述符编号(0 = stdin,1 = stdout ...)进行索引,并包含类型(文件,管道)和模式(r / w ...)以及文件类型的文件名。

然后,您可以在 $pipes 中获取一个文件描述符数组,该数组可用于读取或写入(取决于请求的内容)。

您不应忘记在使用后关闭这些描述符。

请参阅 PHP 手册页(特别是示例):https://php.net/manual/en/function.proc-open.php https://php.net/manual/en/function.proc-open.php

请注意,读/写与生成的命令相关,而不是与 PHP 脚本相关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获/抑制 php exec 的所有输出,包括 stderr 的相关文章

随机推荐

  • 替换图像的颜色

    我试图用白色替换图片的黑色 反之亦然 这实际上是为了让我的 OCR 代码可以在白色背景上更好地读取它 当前正在从剪贴板获取图像 Image img Clipboard GetImage pictureBox1 SizeMode Pictur
  • 为什么这么多 wpf 控件实现 CLR 属性而不是依赖属性?

    是因为控件程序员太懒 太难实现还是知识不够 无论它们是来自第 3 方供应商还是 Microsoft 本身的自定义控件 很多控件通常具有 clr 属性而不是 DP 结果是我无法绑定到它们 wpf 不就是绑定吗 我的下一个问题是 为什么这么多
  • Razor视图引擎,html之间怎么写?

    我的剃刀语法有一些问题 我想知道如何在 html 之间编写 请参阅此示例 ul foreach var x in Model li x Subject Tags nbsp if x Tags null foreach var t in x
  • 如何在 iOS 6.1 上重现网站崩溃

    我收到了一份错误报告这个网站 http festivals ie 在 iOS 6 1 上查看时会崩溃 尽管我猜想 iOS 6 1 附带的浏览器版本比操作系统本身更相关 我没有任何 iOS 设备 因此我不确定如何重现 调查该问题 有人建议我如
  • 将字典转换为结构化格式字符串

    我有一个 Dictionary 对象声明为var as Dictionary of String String 我正在尝试利用通用集合可用的 LINQ 扩展 但我只获得非扩展方法 我需要将 Dictionary 集合转换为具有以下模式的字符
  • 如何使用Istio的Prometheus配置kubernetes hpa?

    我们有一个 Istio 集群 我们正在尝试为 Kubernetes 配置水平 pod 自动缩放 我们希望使用请求计数作为 hpa 的自定义指标 我们如何利用 Istio 的 Prometheus 来达到同样的目的 这个问题比我想象的要复杂得
  • Angular-Gantt - 可以将日期标题更改为“M,T,W,Th ...”而不是日期?

    我正在使用 Angular Gantt js 模块开发一个调度应用程序 它工作正常 gt 除了我想自定义标题以显示日视图比例中的列 M T W Th F 目前它显示像这个演示版本 gt https www angular gantt com
  • 是否可以使用 Jupyter Notebook for AWS Glue 而不是 Zeppelin

    我开始使用 AWS Glue 进行数据 ETL 我已将数据源拉入我的 AWS 数据目录 并准备为我用于测试的一个特定 Postgres 数据库中的数据创建一项作业 我在网上读到 在创作自己的作品时 可以使用 Zeppelin 笔记本 我根本
  • 与实体框架“代码优先”的映射

    我正在尝试使用实体框架 代码优先 来映射我的实体 但在映射复杂类型时遇到问题 这是我的简化示例 域对象看起来像 public class Customer public Address DeliveryAddress get set pub
  • 将特定字符添加到重复的字符串中

    我有一个名字向量 gt dput vec dup c Mark Simon Marcus Greg Simon Greg Marta Marta Tim Tim Greg Tom Tom Greg 一些名称在此向量中重复 我想向每个字符串添
  • Objective c UITableView 无法使用自定义单元格和视图平滑滚动

    我希望表格视图在每一行中显示多个可滚动的图像 为此我正在使用UITableView and Custom UITableViewCell 在自定义 tableView 单元格中 我正在生成具有多个视图和图像的滚动视图 因此当我滚动表格时 它
  • UIWebView使用本地图像和javascript文件加载远程html页面

    我正在创建应用程序 该应用程序将使用本地图像和 javascript css 文件在 UIWebView 上显示远程页面 以加快加载速度 我想避免使用缓存 因为要使其工作 必须首先加载所有内容 我在网上寻找可能的解决方案 这是我所拥有的 N
  • 如何获取 tkinter 中标签的当前宽度

    我在文本中有一个标签 我想获取标签的当前宽度 import tkinter as tk import tkinter ttk as ttk root tk Tk label tk Label root text hello world la
  • 如何使用publish_actions进行测试而无需审核?

    我需要测试分数在 Facebook 上的帖子 但它需要publish actions 权限 我使用 Unity3D 的 Facebook SDK 的最新版本 是否可以在不审核我的申请的情况下获得publish actions 权限 我尝试使
  • HTML5 视频 - 最大播放速率是多少?

    您可以设置 HTML5 视频元素的播放速率 var player document getElementById video player playbackRate 100 w3 规范没有定义限制 最大播放速率是多少
  • ESLint 错误 - ESLint 找不到配置“react-app”

    我和我的团队使用 create react app bootstrap 命令启动一个新的 React 项目 我们在项目中添加了 eslint 部分 但我们遇到了以前从未发现过的恼人错误 当我们启动命令时 yarn run lint Here
  • 在java 9中使用jdeps为自动模块创建模块信息

    我有 3 罐杰克逊图书馆 杰克逊核心 2 8 10 jar Jackson annotations 2 8 0 jar 杰克逊 databind 2 8 10 jar 我成功地为核心和注释创建了 module info java 并使用 j
  • 将我的 TTS 引擎添加到 Android TTS 服务(如 SAPI)

    我在 Android 中开发了自己的 TTS 应用程序 有没有办法将我的 TTS 引擎部署到操作系统中 而不是运行 TTS 应用程序 以便其他应用程序可以调用我的 TTS 类似于 MS Window 中的 SAPI SVOX 可以将引擎打包
  • MDB 注释的可配置值

    我正在尝试使用这个方法 http www jboss org community docs DOC 10032用于在我们的 EJB3 应用程序中接收邮件 简而言之 这意味着创建一个带有以下注释的 MDB MessageDriven acti
  • 捕获/抑制 php exec 的所有输出,包括 stderr

    我想通过运行几个命令exec 但我不想在屏幕上输出任何内容 然而 我确实想保留输出 以便我可以在脚本运行时控制详细程度 这是我的课程