03 April 2009

(PHP) OSのアップグレードでexec関数で実行できなくなった外部コマンド

このホームページを構築しているレンタルサーバのFreeBSDがアップグレード(Ver6 から Ver7 へ)された後に、いままで PHP の exec 関数で実行できていた外部コマンド (gpg コマンド) が実行できなくなった。

なお、sshで接続したシェル上より直接PHPスクリプトを実行した場合は、exec関数でgpgコマンドは問題なく実行できる。

実行できなくなったPHPスクリプトの例 : test.php

<?php
exec("gpg -a -e -r mymail@example.com filename.txt");
?>

UNIXのシェル上からは実行可能 (次の例)


[user@www] php test.php

まず疑ったのは、セーフモード。 次のようなスクリプトで、PHPの環境を調査してみる。


<?php
$str=phpinfo();
print($str);
?>

表示されたPHPの環境は次のようなもので、特に問題は無い (セーフモードの設定はphp公式マニュアルに書かれている

safe_mode = Off
safe_mode_exec_dir = "/usr/local/php/bin"

なお、 safe_mode_exec_dir を php.ini で無理矢理 gpg のパスに変更しても、状況は代わらず。

safe_mode_exec_dir="/usr/local/bin/"

ログファイルにも、何も記録されていないし。お手上げ。

ログファイルの設定 (ログ設定はphp公式マニュアルに書かれている

php.ini

display_errors=Off
error_reporting=E_ALL ← これに変更
;error_reporting=E_ALL & ~E_NOTICE
log_errors=On
error_log="/home/username/log/phperror.log"

PHPスクリプトはユーザ権限で動いている(PHPでファイルを作成すると、そのユーザ所有になるため)ので、特に問題あるようには思えない。

解決手法はどこか他にあるんだろうね…