3

最近、アプリケーションをデプロイしたときにエラーが発生しました。インクルード パス内のパスで「is_readable」を使用しましたが、「open_basedir」によって制限されていました。これにより、致命的なエラーが発生しました。実際にファイルを含める前に、ファイルが含まれているかどうかを確認するために使用できる別の機能はありますか?


編集:これは機能しますが、エラーがインクルードの失敗によるものか、インクルードされたファイル内のエラーによるものかを検出するにはどうすればよいですか?

try {
 include 'somefile.php';
 $included = true; 
} catch (Exception $e) {
 // Code to run if it didn't work out
 $included = false;
}
4

3 に答える 3

2

あなたはこれを「試す」ことができます;)

<?php

function exceptions_error_handler($severity, $message, $filename, $lineno) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
set_error_handler('exceptions_error_handler');
try {
    include 'somefile.php';
    $included = true;
} catch (Exception $e) {
    // Code to run if it didn't work out
    $included = false;
}
echo 'File has ' . ($included ? '' : 'not ') . 'been included.';
?>

それが機能しない場合、$ includeはtrueに設定され、次にキャッチでfalseに設定されます。それが機能した場合、$includedはtrueのままです。

于 2009-09-28T15:55:46.590 に答える
1

次を使用して、open_basedir rescriction (設定されている場合) の値を確認できます。

ini_get( 'open_basedir' );

設定されていない場合は、許可されたパスまたは空の文字列を返します。

編集:

open_basedir 制限の安全な方法でインクルード パスをチェックすると、次のようになります。

if ( strlen( ini_get( 'open_basedir' ) ) > 0 )
{
    $includeFile = 'yourInclude.php';
    $includePath = dirname( realpath( $includeFile ) );

    $baseDirs = explode( PATH_SEPARATOR, ini_get( 'open_basedir' ) );
    foreach ( $baseDirs as $dir )
    {
        if ( strstr( $includePath, $dir ) && is_readable( $includeFile ) )
        {
            include $includeFile;
        }
    }
}

ただし、ショートカットが表示された場合は、自由に改善してください。

于 2009-09-28T13:29:45.903 に答える
0

statを使用して、ベースディレクトリが設定されているときに非常にバグがあると聞いている is_readable と同じ効果を達成することができます。

于 2009-09-28T18:32:30.253 に答える