PHP system()和exec()函数不使用临时文件

时间:2012-12-13 01:13:34

标签: php web-services

我正在使用PHP中的system()函数来调用我需要使用的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时,我可以从我的主目录获取目录列表并通过PHP脚本回显 - 表示我应该有访问使用Apache运行系统和exec命令,但无论何时运行此命令,它都不起作用。但是,当我不删除临时文件,并在CLI中使用相同的PHP创建的命令(xml2brl -p /private/tmp/pll_MYRy9m /private/tmp/pll_DmiK7E)和临时文件时,我可以在我的用户下运行它们。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

首先尝试在命令中包含xml2brl的完整路径,然后告诉我们结果。

之类的东西
$command = escapeshellcmd("/opt/local/bin/xml2brl -p" . " " . $_standardText . " " . $_translatedText);