PHP is_readable проблема с open_basedir

Недавно я получил ошибку при развертывании приложения. Он использовал "is_readable" на пути внутри пути включения, но он был ограничен "open_basedir". Это дало мне фатальную ошибку. Есть ли другая функция, которую я мог бы использовать, чтобы увидеть, является ли файл включаемым, прежде чем фактически включить его?


Изменить: это работает, но как я могу определить, произошла ли ошибка из-за сбоя при включении или из-за какой-то ошибки во включаемом файле?

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

3 ответа

Решение

Вы могли бы "попробовать" это;)

<?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.';
?>

Если это не сработает, для $ enabled будет установлено значение true, а затем false в подвохе. Если это сработало, $ enabled остается верным.

Вы можете проверить значение rescriction open_basedir (если установлено), используя

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;
        }
    }
}

Но не стесняйтесь улучшать это, если вы видите ярлык.

Вы можете попробовать использовать stat для достижения того же эффекта, что и is_readable, который, как я слышал, очень глючит, когда установлен базовый каталог.

Другие вопросы по тегам