PHP proc_open返回值始终等于127

时间:2018-03-25 17:00:14

标签: php

我面临着PHP的重大问题。 我正在创建PHP应用程序,它将"使用"另一个应用。我想重定向输入和输出。我使用proc_open这样做了。 文件gsqasm位于/var/www/http内。工作目录相同,因此 ./gsqasm应该可以解决问题。太糟糕了,它没有。 返回代码始终等于127 。谷歌搜索了一段时间后,我发现127意味着无法找到文件。然后,为了确保,我检查了/tmp/error-output.txt文件。它的内容是:

sh: 1: gsqasm: not found
sh: 1: /var/www/http/gsqasm: not found
sh: 1: /var/www/http/gsqasm: not found
sh: 1: /var/www/http/gsqasm: not found
sh: 1: ./gsqasm: not found
sh: 1: ./gsqasm: not found
sh: 1: .gsqasm: not found
sh: 1: /var/www/http/gsqasm: not found
sh: 1: /var/www/http/gsqasm: not found

正如你所看到的,我尝试过maaany次,没有运气。我显然错过了一些明显的东西,但我无法弄明白。这是我的代码:

<?php
$descriptorspec = array(
    0 => array(
        "pipe",
        "r"
    ), // stdin is a pipe that the child will read from
    1 => array(
        "pipe",
        "w"
    ), // stdout is a pipe that the child will write to
    2 => array(
        "file",
        "/tmp/error-output.txt",
        "a"
    ) // stderr is a file to write to
);

$cwd = '/tmp';
$env = array(
    'some_option' => 'aeiou'
);

passthru('echo $PWD');
echo '<br>';
$process = proc_open('./gsqasm', $descriptorspec, $pipes, $cwd, $env);

if (!isset($_POST['input'])) {
    echo "Input is empty.";
}

if (is_resource($process)) {
    // $pipes now looks like this:
    // 0 => writeable handle connected to child stdin
    // 1 => readable handle connected to child stdout
    // Any error output will be appended to /tmp/erroroutput.txt

    fwrite($pipes[0], $_POST['input']);
    fclose($pipes[0]);

    echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // It is important that you close any pipes before calling
    // proc_close in order to avoid a deadlock
    $return_value = proc_close($process);

    echo "command returned $return_value\n";
}
?>

如何在重定向流的同时更改此代码,正确执行应用程序?这不是为生产而设计的代码,它是一些快速而又脏的东西,在一段时间后会变得坚固。

1 个答案:

答案 0 :(得分:2)

退出代码127实际上意味着“未找到命令”。该文件可能存在于/var/www/http/gsqasm,但您要告诉它查看/tmp/gsqasm。您有$cwd,即运行该命令的工作目录,设置为/tmp。该命令也由./作为前缀,告诉它查看({1}}的当前工作目录(错误提供)。

要解决此问题,您可以将gsqasm更改为$cwd(请参阅documentation,默认为脚本的目录)或程序位置的绝对路径,您说这是还null。您还可以更改/var/www/http以包含该绝对路径。这三个选项中的任何一个都可以使用,我个人会因为简单而推荐第一个。