2

我正在使用system()PHP 中的函数来调用我需要使用的 CLI 程序,该程序当前在 PHP 中不可用(下面的代码)。我正在使用 xml2brl (liblouisxml) CLI 生成包含盲文 ASCII 文本的输出文件。使用下面的代码,成功创建了两个文件,第一个文件成功写入了输入文本;但是,输出文件(第二个文件)永远不会将翻译后的文本写入其中。

不过,这是奇怪的部分。使用传递给的相同命令system()和我在 PHP 中创建的相同临时文件,我可以在终端中以我的用户身份成功运行该命令。这个问题可能是由什么引起的?当我通过 运行whoami命令时system(),我得到了我的用户,并且临时文件或 CLI 命令都不需要特殊权限xml2brl

目前,我正在 PHP 中创建两个临时文件:

//Create the temporary files that will be passed to xml2brl
$_standardText = tempnam("~/tmp", "pll_");
$_translatedText = tempnam("~/tmp", "pll_");

临时文件存储在 /private/tmp 中,并带有pll_前缀,以标识 PHP 脚本正在创建的文件。

然后,我将传递的文本的内容写入临时文件,如下所示:

//Write the contents of the passed text to the temp file
$handle = fopen($_standardText, "w");
fwrite($handle, $text);
fclose($handle);

现在,位于其中的临时文件中/private/tmp/xxxx写入了文本(验证了这一点),然后我继续格式化命令:

$command = escapeshellcmd("xml2brl -p" . " " . $_standardText . " " .  $_translatedText);

回显 $command 变量时,它的格式如下:

xml2brl -p /private/tmp/pll_MYRy9m /private/tmp/pll_DmiK7E

继续运行 exec 命令,它应该处理输入文件并将翻译后的文本写入输出文件,但它没有:

exec($command);

ls现在,这是奇怪的部分……当我尝试只做一个使用 Apache,但无论何时运行此命令,它都不起作用。但是,当我不删除临时文件并xml2brl -p /private/tmp/pll_MYRy9m /private/tmp/pll_DmiK7E在 CLI 中使用相同的 PHP 创建的命令 ( ) 和临时文件时,我可以在我的用户下运行它们。

4

3 回答 3

2

您应该做的第一件事(确保您的脚本可以运行简单的命令,例如/bin/ls)是充分利用exec()的参数:

exec($command, $out, $code);
if ($code) {
    // an error occurred while running the command
}

其次,确保路径正确。xml2brl可能在您的路径中,但可能不在您的脚本路径中:

$command = '/usr/bin/xml2brl -p ' . escapeshellarg($_standardText);

exec($command, $out, $code);
if ($code) {
    die("An error occurred while attempting torun xml2brl");
} else {
    echo "Output was: ", join("\n", $out);
}

如果这仍然不起作用,您可以重定向stderr

exec("$command 2>&1", $out, $code);
于 2012-12-13T01:59:44.790 回答
0

包括错误报告(E_ALL);在脚本的开头,看看是否有任何你没有注意到的警告。chmod xml2brl 到 777 以确保 apache 可以执行它。只是出于好奇,xml2brl 位于哪里?确保 apache 有权访问此目录。你说你可以通过一个术语自己做,如果你也一直在手动做这些文件,你是否肯定 apache 制作了这些文件?

确保 apache 具有对临时文件的读写权限,并确保 apache 具有执行 xml2brl 的访问权限和权限。

于 2012-12-13T01:51:32.687 回答
0

尝试在您的命令中首先包含 xml2brl 的完整路径,然后让我们知道结果。就像是

$command = escapeshellcmd("/opt/local/bin/xml2brl -p" . " " . $_standardText . " " . $_translatedText);
于 2012-12-13T02:11:16.360 回答