誰かが私を啓発し、次の動作を説明できることを願っています。
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 番目のケースで一致を反転したため、何も返さない代わりにすべての行を返すようになりました。
なぜそうなのか、今でもわかりません。