пятница, 22 февраля 2013 г.

Если столкнулись с php ошибкой open_basedir


require_once() [function.require-once]: open_basedir restriction in effect


Вот что съело целый час моего времени, которое я мог потратить на разработку своего приложения DojoDojo. Возникает она, из-за настроек php.ini, а именно пункт open_basedir, в котором прописаны пути.
  • open_basedir ограничивает список файлов, к которым может обращаться PHP, указанным деревом директорий.
  • open_basedir может применяться независимо от того, используется защищенный режим или нет.
 На хабре уже обсуждалось, что из-за настроек open_basedir, файлы могут не загружаться на сервер.
Настройки php.ini можете просмотреть запустив phpinfo(), или создав файл info.php на сервере и вставив туда код

<?php
phpinfo(); 
?>

Он выведет, всю информацию, и в пункте open_basedir можно увидеть пути, которые открыты для использования скриптами. Значит если возникает эта ошибка, скорее всего Вашему скрипту доступ к каталогу, к которому доступ ему запрещает php.ini. Нужно дополнить, в значение open_basedir, путь до каталога скрипта.

Итак, ошибка ясна, что дальше? Рытье в гугле дало следующее.
Дальше есть три способа решить этот вопрос.
1. Изменить php.ini, добавив туда нужный каталог со скриптом, (просто вставив после двоеточия). Этот способ, я отношу к маловероятным, так как хостинг редко дает возможность изменять этот файл. Можете написать в техподдержку хостинга, возможно они решат эту проблему.
2. Добавить .haccess (если нет), прописав туда значение "php_value open_basedir Путь". Тоже не всегда помогает. Мне не помог. Но вдруг поможет Вам.
3. Создав свой php.ini файл, в корневой папке.
Если Php запущен как fast-cgi. А это обычно php 5.3*.
Добавляем в .htaccess


AddHandler php5-fastcgi .php
Action php5-fastcgi /cgi-bin/php5.fcgi


В этой же папке создаем папку cgi-bin (она уже там может быть), переходим в нее и создаем в ней файл php5.fcgi .
То есть выходит создан файл по адресу public_html/cgi-bin/php5.fcgi. Содержимое данного файла:


#!/bin/sh
exec /usr/local/cpanel/cgi-sys/php5 -c /home/ВАШ ЛОГИН ОТ СИПАНЕЛИ/public_html/cgi-bin/php.ini 


Сохраняем и ставим права на этот файл 755.

После чего, создаем файл php.ini там же, в папке cgi-bin и прописываем туда необходимые php директивы через равно. Например:


register_globals = on
magic_quotes_gpc = on
open_basedir = /home:/tmp


Сохраняем, и все начинает работать.

Да, способы, так себе, но пока не нашел ничего лучше.