include() i require() a open_basedir
Ostatnio spędziłem parę godzin szukając, dlaczego nie mogę includwać plików w swoich serwisach - okazało się, że winny jest open_basedir, który ustawiony jest dla konkretnej ścieżki, i include() (oraz inne funkcja otwierające pliki) tam właśnie zaczynają szukać plików, które mają wczytać - i nie przeszukują podkatalogów.
Popularne, i wszędzie sugerowane rozwiązanie:
<?
#a.php
include('podkatalog/b.php');
#podkatalog/b.php
include('plik.php');
Gdzie plik.php znajduje się w tym samym katalogu co a.php mimo, że wydaje się logiczne i w większości wypadków działa, może okazać się, że dzięki open_basedir przestało.
Rozwiązania?
a) wyłączyć dyrektywę open_basedir w php.ini (i masie podrzędnych, jeżeli masz dużo hostów virtualnych)
b) podawać ścieżki względne lub bezwzględne do dołączanych plików, np. tak:
<?
include('../plik.php');
# albo lepiej
include(dirname(__FILE__) . '/../plik.php');