ProfiPHPProfiPHP
Категория: Директивы PHP

Директива Open_basedir

Директива Open_basedir ограничивает список файлов, которые могут быть открыты в PHP, указанным деревом директорий.
open_basedir string
Каждый раз, когда скрипт пытается открыть файл, например, с помощью функции Fopen или подключить с помощью функции Include, проверяется расположение файла. В случае, если он находится вне указанного дерева директорий, PHP отказывает в открытии файла. Все символические ссылки распознаются и преобразуются, поэтому обойти это ограничение с помощью символических ссылок невозможно.
Warning: include(...): failed to open stream 
Базовой следует считать директорию, в которой расположен сам скрипт. В этом случае следует быть осторожным, так как рабочую директорию скрипта можно легко изменить при помощи функции Chdir.

Директива Open_basedir может быть отключена в конфигурационном файле httpd.conf (например, для некоторых виртуальных хостов). Для Windows-систем разделителем списка директорий служит точка с запятой. Для всех остальных операционных систем в качестве разделителя используется двоеточие. В случае, если PHP работает как модуль веб-сервера Apache, все указания Open_basedir для родительских директорий наследуются.

Специальное значение "." обозначает, что рабочая директория скрипта будет использована в качестве базовой директории. Однако, это немного опасно, так как текущая директория скрипта может быть легко изменена с помощью Chdir.

Множество функций PHP также использует Open_basedir.

А теперь рассмотрим негативную сторону данной директивы.

Каждый разработчик и администратор стремится к оптимизации работы как программы, так и сервера. Директива Open_basedir очень негативно влияет на скорость работы PHP (файловые операции, например, Include). На пустом ненагруженном сервере скорость генерации страниц может снизиться на 20-30%, а при высокой нагрузке - в 2-3 раза.

Протестуем на скорость данную директиву:
$btime = microtime( true );
for ( $i = 1; $i < 1000; $i++ ) {
@include( $_SERVER['DOCUMENT_ROOT'].'/'.$i.'.php' );
}
echo '('.round( microtime( true ) - $btime, 4 ).' сек.)';
При неактивном состоянии директивы результат - 0.0134 секунды. Теперь активируем директиву и снова проведем цикл. Результат - 0.0305 секунды.

Данный пример далек от практической реализации, он служит лишь примером расчета времени выполнения. Но если на сервере находится несколько сайтов с большой посещаемостью, это может создать излишнюю нагрузку на сервер, в чем мы убедились на примере.

Директива Open_basedir относиться к режиму PHP_INI_ALL, поэтому значение может быть установлено отовсюду.

Добавить комментарий

Имя:
Текст комментария: