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, который, как я слышал, очень глючит, когда установлен базовый каталог.