【问题标题】:How to execute a perl script within php and capture error messages?如何在 php 中执行 perl 脚本并捕获错误消息?
【发布时间】:2011-02-10 10:23:07
【问题描述】:

我正在尝试像这样执行 Perl 脚本:

/usr/bin/ec2-consistent-snapshot 'vol-dr3131c2'

当 Perl 脚本失败时,它会使用 'die' 退出并打印出错误消息。手动执行时我可以看到该错误消息,但我无法通过 PHP 捕获它。

我尝试了以下但没有成功:

exec($command,$output);
echo system($command,$output);
passthru($command);

有什么想法吗?

【问题讨论】:

    标签: php perl die


    【解决方案1】:

    你可以试试:

    $command = "/usr/bin/ec2-consistent-snapshot 'vol-dr3131c2' > /tmp/exec.out 2>&1"
    exec($command)
    echo file_get_contents('/tmp/exec.out');
    

    '> /tmp/exec.out 2>&1' 将所有输出重定向到 /tmp/exec.out,然后 PHP 回显文件。

    【讨论】:

    • 会尝试一下。知道为什么 PHP 无法捕获输出吗?我感觉错误消息不会输出到标准输出。
    • 错误消息可能会发送到 stderr,而 PHP 只接收 stdout。我只是快速地将代码扔到那里,没有考虑不同,但你可能会删除'> /tmp/exec.out'部分,只是让它将stderr重定向到stdout'2>&1'。如果这样可行,您将不会留下 tmp 文件,并且 PHP /应该 / 捕获错误消息。
    【解决方案2】:

    PHP 没有反引号吗?

    $output = `$command 2> /tmp/command.err`;
    if (looks_like_command_failed($output)) {
        $error_message = file_get_contents('/tmp/command.err');
    }
    

    【讨论】:

    【解决方案3】:

    system() 函数的文档中给出的第一个示例提到它可能在 php 未接收到输出的情况下工作。该示例从 stdout 中单独接收 stderr,而不使用临时文件。海报没有解释为什么这个方法在 system() 不成功时会成功。所以没有解决根本问题,但也许是一种解决方法。

    【讨论】:

      【解决方案4】:

      Perl 脚本在其消息发送到 stderr 时终止,因此您需要捕获 stderr 以及 stdout 以查看发生了什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-18
        相关资源
        最近更新 更多