2

PHPのsystem()関数を使用して、使用する必要がある CLI プログラムを呼び出していますが、現在 PHP 内からは利用できません (以下のコード)。xml2brl (liblouisxml) CLI を使用して、点字 ASCII テキストを含む出力ファイルを生成しています。以下のコードを使用すると、2 つのファイルが正常に作成され、最初のファイルには入力テキストが正常に書き込まれます。ただし、出力ファイル (2 番目のファイル) には、翻訳されたテキストが書き込まれることはありません。

ただし、ここが奇妙な部分です。渡された同じコマンドとsystem()、PHP で作成した同じ一時ファイルを使用して、ターミナルで自分のユーザーとしてコマンドを正常に実行できます。この問題の原因は何ですか? whoamiコマンドを介して実行するsystem()と、ユーザーが取得され、一時ファイルまたは CLI コマンドのいずれにも特別なアクセス許可は必要ありませんxml2brl

現在、PHP で 2 つの一時ファイルを作成しています。

//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 作成コマンド ( xml2brl -p /private/tmp/pll_MYRy9m /private/tmp/pll_DmiK7E) と一時ファイルを CLI で使用すると、それらを自分のユーザーで実行できます。

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

最初にコマンドにxml2brlの完全なパスを含めてみて、結果をお知らせください。何かのようなもの

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

error_reporting(E_ALL) を含めます。スクリプトの冒頭で、キャッチしていない警告があるかどうかを確認します。chmod xml2brl を 777 に変更して、Apache が確実に実行できるようにします。好奇心から、xml2brl はどこにありますか? apache がこのディレクトリにアクセスできることを確認してください。あなたは用語を介して自分でそれを行うことができると言いましたが、手動でも行っている場合、apache がそれらのファイルを作成したと確信していますか?

apache に一時ファイルへの読み取りおよび書き込みアクセス権があることを確認し、Apache に xml2brl へのアクセス権と実行権限があることを確認します。

于 2012-12-13T01:51:32.687 に答える