2

PHP 経由でシェル コマンドを実行することに関して質問があります。私の目標は、compass compile [project]PHP 経由で正常に実行することです。私は次のことを試しました:

echo system('compass compile [project]', $s); // prints [31m[0m
echo $s; // prints 1

echo passthru('compass compile [project]', $p); // prints [31m[0m
echo $p; // prints 1

echo shell_exec('compass compile [project]'); // prints [31m[0m

echo exec('compass compile [project]', $e, $ee);
print_r($e); // Array ( [0] => [31m[0m )
echo $ee; // prints 1

含まれている実行可能ファイルに対してシェルコマンドを実行しようcompass compile testとしても、上記の試行と同じ結果が得られました。

私の質問 とは[31m[0mどういう意味ですか? これはバイナリデータを表していますか? 検索エンジンが示唆するように、これらはbashの色を表していますか?

私の知る限り、出力は次のようになります。

サンプル出力

キックについては、経由system(/usr/local/bin/compass compile [project]);で実行しようとしましたが、同じ結果が得られました。パスを再確認したので、これらのコマンドを期待どおりに実行できることがわかりました。からの出力は次のecho $PATHとおりです。

/usr/lib/lightdm/lightdm:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:/bin:
/usr/games:
/usr/local/games:
/var/lib/gems/1.9.1/bin

PHP を使用してコンパス プロジェクトをコンパイルする方法はありますか?

4

4 に答える 4

2

以前にも同様のエラーを見たことがあります。

通常、これは bash 起動スクリプトで出力されるものが原因です。たとえば、私の bash スタートアップの 1 つでエコーが発生し、問題の原因がわかるまで多くのスクリプトをジャッキアップしました。

または、おそらくユーザー (www-data ?) は、実際にはホーム ディレクトリと適切な起動スクリプトを用意していませんか?

これを試して、非対話型シェルを取得できます。

exec("/bin/bash -c \"compass compile [project]\"", $e, $ee);
print_r($e); 
echo $ee; 

それでも問題が解決しない場合は、出力を tmp ファイルにリダイレクトして確認してみてください。

exec("/bin/bash -c \"compass compile [project] > /tmp/compass.compile.output\"", $e, $ee);
print_r($e); 
echo $ee; 

参照: .bashrc、.bash_profile、および .environment の違いは何ですか?

于 2013-03-27T03:43:13.150 に答える
1

sass --compassこの問題は、stderr を使用して stdout にリダイレクトすることで修正されました。echo shell_exec("sass --compass [project] 2>&1");

コマンドラインプログラムに手を出してからしばらく経っていたので、これを理解するのはかなり長くて骨の折れるプロセスでした。エラー ストリームと出力ストリームは異なる出力にある可能性があることに注意してください。これをテストする最も簡単な方法は、次の方法で出力をファイルにシャベルすることです。

# do this once with a good file and once with a file that will give errors
sass --poll style.scss > output.txt

stderr をテキスト ファイルにシャベルで移動しても結果が得られない

が空の場合output.txt、エラー出力は上記のケースのように stderr ストリームにあります。これは、stderr を srdout にリダイレクトすることで修正できます。例えば:

sass --poll > output.txt 2>&1

#shows results
cat output.txt

標準エラー出力から標準出力へ

あるテキストエリアから別のテキストエリアに出力をリダイレクトする単純な PHP スクリプトを作成しました。コードはここにあります

于 2013-03-30T19:33:18.863 に答える
0

最初の推測は、権限の問題です。オッズは、PHP を実行しているユーザー アカウントです (コマンド ラインからこれを実行している場合を除き、これは httpd Apache デーモンが実行されているユーザーであると推測しています) には、要求していることを実行する権限がありません。 . ただし、エラーは非常に役に立ちません。

私が知る限り、コマンドラインでエラーを赤で表示しようとしているようです。私の推測では、コードの間に隠された (またはどういうわけか決して印刷されない) 文字があると思います。Apache や PHP のエラー ログを調べて、PHP 変数に含まれていない有用なものがないかどうかを確認してください。または、キックのために、出力をコピーして基本的なテキストエディターに貼り付け、最初から各文字を 1 つずつ削除してみてください...魔法のように何かが表示されるかどうかを確認してください。それがうまくいかない場合は、同じことを逆に試して、最後からバックスペースします。いずれにせよ、エラーが発生しています。非常に重要なため、太字の赤い文字で表示する必要がありますが、まだ届いていません。

実際にパーミッションの問題であること判明し、パーミッションのラングリングで解決できない場合は、Apache ユーザーに書き込みパーミッションがあり、cron ユーザーに読み取りパーミッションがある中間ファイルを作成できます。 . コードを PHP から直接実行する代わりに、それをファイルに入れ、cron を頻繁に実行してそのファイル内の何かを探し、CHECKING IT FOR VALIDITYを実行してから、コンパイラを介して実行し、ファイルから削除します。

それは醜いでしょうが、きれいなものがうまくいかないことがあります。

于 2013-03-27T00:04:14.363 に答える
-1

色は正しいと思いましたが、その定義方法は正しくありません。コンソールでの色の使用に関する詳細については、このドキュメントを参照してください。また、コンパス経由で SCSS をコンパイルするには、Linux で shell_exec コマンドを使用できます。shell_exec の詳細については、このドキュメントを参照してください。それがどうなるか教えてください。

于 2013-03-22T15:31:57.177 に答える