0

誰かが私を啓発し、次の動作を説明できることを願っています。

php 内で shell_exec を使用する場合、次のコードは、シェルで php によって直接実行する場合と Web ページで Apache を介して実行する場合で異なる結果になります。値 (CPU、プロセス数、RAM など) がまったく同じであることを期待しているわけではないので、これはまったく不可能です。問題は、一部の行 (上部の概要) が完全に欠落していることです。

例は単純なので、apache/phe サーバーで再現できるはずです。

phpコードは次のとおりです。

<?php
  $command = 'top -b -n1';
  $commandoutput = shell_exec($command);
  echo strlen($commandoutput);

  echo ":";

  $command = 'top -b -n1 | grep -e "^\s*[a-Z]"';
  $commandoutput = shell_exec($command);
  echo strlen($commandoutput);
?>

シェルで www-data (php test.php) として直接実行すると、次の結果が得られます。

8147:450

しかし、Web ページ ( http://MY.SERVER/test.php ) でまったく同じコードを実行すると、次の結果が得られます。

8147:0

変数 $commandoutput を出力すると、何が欠けているかを簡単に確認できます。なんとなくトップの部分が抜けています。次の行は、grep を介してパイプ処理された後、何らかの理由で Web ページに含まれていません。

top - 23:17:13 up 29 days,  9:20,  3 users,  load average: 0.67, 0.85, 0.72
Tasks:  93 total,   1 running,  92 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.4%sy,  0.0%ni, 89.5%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    507452k total,   453176k used,    54276k free,    41024k buffers
Swap:   407544k total,    40524k used,   367020k free,   287916k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

grep を使用しない場合の結果は正しいため、パーミッションの問題ではないと思います。shell_execに干渉するgrepの魔法は何ですか。スクリプトの実行方法に基づいて shell_exec が異なる結果を返す方法を理解できません。

誰かが何が起こっているのか説明できますか、少なくとも正しい方向に私を導くことができますか?

追加情報: 追加の例:

上記の例では、apache を介してコードを実行すると、grep が正しく一致しなくなり、予想よりも少ない行数になりました。

正規表現を逆さまにして、代わりに不要な行に一致させると

トップ -b -n1 | grep -v -e "^\s*[0-9]"

今回は、Web ページを実行すると、行が多すぎます。to ケース間で確認できる唯一のリンクは次のとおりです。両方のテストで grep マッチングは失敗しますが、2 番目のケースで一致を反転したため、何も返さない代わりにすべての行を返すようになりました。

なぜそうなのか、今でもわかりません。

4

0 に答える 0