Pleskで運用しているドメインについて、
各ドメインの設定画面で、

↑この赤枠のチェックを外せば、PHPのsafe modeをオフにできますが、
Pleskでsafe modeをオフにしても、open_basedirの設定は残ったままです。
PEAR MEDB2では、この設定だけではエラーが発生するケースが考えられます。
MDB2.phpのfileExists()内を見ると、
拡張機能や各DBへのドライバファイルの存在をチェックするのに、
safe modeがオフのときは is_readable()でファイルをチェックし、
そうでないときは、fopen()でチェックしているようです。
MDB2ではsafe modeオフのときのみ、is_readable()が使えないという前提で設計されていますが、
実際はそれだけでは不十分で、is_readable()はopen_basedirの制約もうけますから、
MDB2.phpのインストール場所などによっては、
safe modeはオフであるけれど、open_basedirの設定が残るPlesk環境下では、エラーが発生してしまいます。
解決方法は、2つ。
1)vhost.confでopen_basedirをno_valueにする。
クララオンラインサイトに説明がありますので、御覧ください。
http://support.clara.jp/clarafaq/index.php?action=artikel&id=45&artlang=ja
2)MDB2.phpを改変してしまう。
MDB2.phpの
function fileExists($file)
{
// safe_mode does notwork with is_readable()
if (!@ini_get('safe_mode')) {
$dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
foreach ($dirs as $dir) {
if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
return true;
}
}
} else {
$fp = @fopen($file, 'r', true);
if (is_resource($fp)) {
@fclose($fp);
return true;
}
}
return false;
}
を
function fileExists($file)
{
// safe_mode does notwork with is_readable()
if( false ){
$dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
foreach ($dirs as $dir) {
if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
return true;
}
}
} else {
$fp = @fopen($file, 'r', true);
if (is_resource($fp)) {
@fclose($fp);
return true;
}
}
return false;
}
に変更する。
2のがお手軽かなー。でも、fopenな上に@でエラー制御してるので、パフォーマンスは落ちます。ご注意を。
ま、あれですけど、open_basedirとかの制約を受けてる状態で、積極的にPEARを利用しようとするほうが、技術者としては間違っているかもしれませんが(^-^;
Comment feed