Polish English
Runaurufu "If you don't hava a plan - do not follow plan of others"

open_basedir restriction in effect

Jeżeli zdarzyło Ci się kiedykolwiek ujrzeć błąd podobny do tego:

Warning: session_start() [function.session-start]: open_basedir restriction in effect. File(/var/tmp/) is not within the allowed path(s): (/tmp:/home:/usr/local/ispmgr/distfiles) in /home/user/data/www/somefile.php on line

Fatal error: session_start() [function.session-start]: Failed to initialize storage module: files (path: ) in /home/user/data/www/somefile.php on line
to znak, że Twój hosting stwarza Ci problemy.
Przeszukując sieć w nadziei szybkiego odnalezienia rozwiązania zapewne natkniesz się na wiele sposobów zażegnania tego problemu i zapewne większość z nich będzie zakładać, że masz nieskrępowany dostęp do konfiguracji serwera. Niemniej jeżeli korzystasz z współdzielonego hostingu (na przykład z ultimahost.pl) to o takich rozwiązaniach możesz w 99.9% zapomnieć.
Na szczęście PHP daje programiście dużą swobodę w obchodzeniu serwerowych ograniczeń.
Jednak nim przejdziemy do przedstawienia rozwiązania trochę teorii o źródle problemu :)

Skąd ten problem?

Źródłem problemu w większości przypadków jest ustawienie zmiennej session.save_path w taki sposób, by wskazywała na folder, do którego modyfikacji nie mamy uprawnień (a konkretniej nie ma ich użytkownik interpretujący kod PHP). W przypadku nie ustawienia wartości tej zmiennej PHP wykorzystuje domyślną ścieżkę - "/var/tmp/", która również może wskazywać na folder, do którego nie mamy dostępu (co zwykle jest powodem problemów w przypadku hostingu współdzielonego).
Folder wskazany przez ową zmienną jest miejscem przechowywania stanu wszystkich aktywnych sesji, tak więc bez niego, jak i bez możliwości tworzenia i edycji plików w nim się znajdujących po prostu nasz kod nie będzie umożliwiał wykorzystywania sesji.

Proste rozwiązanie

Skoro już wiemy, że problem leży w nieodpowiedniej ścieżce używanej do zapisu sesji to wystarczy:
  1. Utworzyć folder na serwerze, w którym będziemy przechowywać dane sesji.
  2. Wywołać w kodzie przed pierwszym session_start() (a najlepiej zaraz po pierwszym <?php) następujący kod:
    session_save_path($lokalizacjaFolderuSesji);
    np. w celu użycia folderu "sesje" w tym samym folderze co skrypt uruchamiający sesję można wywołać:
    session_save_path($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'sesje');

    Alternatywą jest wywołanie funkcji ini_set():
    ini_set('session.save_path', $lokalizacjaFolderuSesji);
    która robi to samo co session_save_path(), czyli ustawia zmienną konfiugracyjną session.save_path.
2014-02-11 19:16:41
2014-02-11 20:28:56

Tags: PHP
Categories: IT related

No comments

Write new comment

Author:
Email (visible only to administration):
Website: