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:
- Utworzyć folder na serwerze, w którym będziemy przechowywać dane sesji.
- 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.
No comments
Write new comment