Błąd Function putenv() was disabled by the domain protection module potrafi zaskoczyć w najmniej oczekiwanym momencie – szczególnie po tym, jak sklep działał bez zarzutu przez długi czas. W tym wpisie wyjaśniam skąd się bierze ten problem i jak go szybko rozwiązać.
Co to właściwie jest putenv()?
putenv() to wbudowana funkcja PHP służąca do ustawiania zmiennych środowiskowych w czasie działania skryptu. PrestaShop korzysta z niej m.in. podczas obsługi lokalizacji i tłumaczeń – wywołuje ją przy ustawianiu locale dla danego języka sklepu. Bez tej funkcji sklep nadal może działać, ale w logach zaczynają pojawiać się ostrzeżenia, a w niektórych konfiguracjach błędy mogą być widoczne bezpośrednio na stronie – co oczywiście jest niedopuszczalne na produkcji.
Skąd się bierze ten błąd?
Problem jest charakterystyczny dla hostingów współdzielonych, które używają mechanizmu separacji domen (ang. domain protection). Mechanizm ten izoluje poszczególne domeny od siebie na poziomie systemu operacyjnego, co jest dobrą praktyką bezpieczeństwa – ale przy okazji blokuje pewne funkcje PHP, w tym właśnie putenv(). Najbardziej popularnym przypadkiem jest hosting Cyber Folks oraz Hostido, który od pewnego momentu zaczął automatycznie włączać tę opcję przy każdej nowo dodanej domenie lub subdomenie. Efekt? Sklep działał bez problemu, dodałeś subdomenę albo przepinałeś domenę – i nagle zaczął sypać ostrzeżeniami.
Ostrzeżenie
Jeśli błąd pojawia się bezpośrednio na stronie sklepu (a nie tylko w logach), pilnie wyłącz wyświetlanie błędów PHP w konfiguracji serwera lub pliku config/defines.inc.php – widoczne błędy na froncie to poważny problem wizerunkowy i bezpieczeństwa.
Pełna treść ostrzeżenia wygląda tak:
User Warning: Function putenv() was disabled by the domain protection module. Disable domain protection for this domain in the Server Panel to use this function.
Rozwiązanie jest bardzo proste i nie wymaga żadnych modyfikacji w kodzie sklepu. Wystarczy wyłączyć separację domen w panelu hostingowym.
Zaloguj się do panelu DirectAdmin – zazwyczaj dostępny jest pod adresem nazwadomeny.pl:2222 lub nazwadomeny.pl:2223
Przejdź do sekcji Ustawienia domen
Znajdź domenę swojego sklepu na liście
Zmień opcję Separacja domen z TAK na NIE
Zapisz zmiany
Sukces
Po wyłączeniu separacji domen błąd powinien zniknąć natychmiast, bez konieczności restartu serwera czy przebudowy cache PrestaShop.
A co jeśli mam inny panel hostingowy?
Nie każdy hosting korzysta z DirectAdmin. Poniżej zebrałem, gdzie szukać tej opcji w innych popularnych panelach:
Panel hostingowy
Gdzie szukać ustawienia
DirectAdmin (Cyber Folks)
Ustawienia domen – Separacja domen – NIE
cPanel
PHP Selector lub ModSecurity – sprawdź wyłączone funkcje PHP
Plesk
Domeny – ustawienia PHP – Wyłączone funkcje
HestiaCP
Brak wbudowanej separacji domen – sprawdź konfigurację PHP-FPM w /etc/php/X.X/fpm/pool.d/
Własny serwer (VPS/dedyk)
Plik php.ini lub php-fpm.conf – dyrektywa disable_functions
Rozwiązanie alternatywne – własny serwer lub brak dostępu do panelu
Jeśli masz dostęp do pliku php.ini lub konfiguracji PHP-FPM, sprawdź czy putenv nie figuruje na liście zablokowanych funkcji:
disable_functions = putenv, ...
Usuń putenv z tej listy i zrestartuj PHP-FPM:
systemctl restart php8.1-fpm
Notatka
Numer wersji w poleceniu powyżej dostosuj do wersji PHP używanej przez Twój sklep. Możesz to sprawdzić w panelu hostingowym lub przez plik phpinfo().
Czy warto martwić się tym błędem?
Tak. Choć sklep często działa pozornie normalnie mimo tego ostrzeżenia, to:
błąd może pojawiać się na stronie dla klientów (zależnie od konfiguracji wyświetlania błędów PHP)
w niektórych wersjach PrestaShop niepoprawne ustawianie locale może powodować problemy z generowaniem faktur PDF lub tłumaczeniami maili
nagromadzone ostrzeżenia w logach utrudniają diagnozowanie rzeczywistych problemów
Wskazówka
Po każdym dodaniu nowej domeny lub subdomeny na hostingu Cyber Folks wejdź od razu w ustawienia domeny i sprawdź opcję separacji – domyślnie włącza się automatycznie i lepiej wyłączyć ją zanim sklep zacznie generować błędy.
Masz inne pytania dotyczące konfiguracji PrestaShop lub problemów z hostingiem? Zostaw komentarz poniżej.
Używamy plików cookie, aby poprawić komfort korzystania z strony. Korzystając z niej, wyrażasz na to zgodę.
Preferencje plików cookie
Zarządzaj swoimi preferencjami dotyczącymi plików cookie poniżej:
Niezbędne pliki cookie umożliwiają korzystanie z podstawowych funkcji i są niezbędne do prawidłowego działania strony internetowej.
Nazwa
Opis
Czas trwania
Cookie Preferences
This cookie is used to store the user's cookie consent preferences.
30 days
These cookies are needed for adding comments on this website.
Nazwa
Opis
Czas trwania
comment_author
Used to track the user across multiple sessions.
Session
comment_author_email
Used to track the user across multiple sessions.
Session
comment_author_url
Used to track the user across multiple sessions.
Session
These cookies are used for managing login functionality on this website.
Nazwa
Opis
Czas trwania
wordpress_test_cookie
Used to determine if cookies are enabled.
Session
wordpress_logged_in
Used to store logged-in users.
Persistent
wordpress_sec
Used to track the user across multiple sessions.
15 days
Pliki cookie statystyczne gromadzą informacje w sposób anonimowy. Informacje te pomagają nam zrozumieć, w jaki sposób użytkownicy korzystają z naszej strony internetowej.
Google Analytics is a powerful tool that tracks and analyzes website traffic for informed marketing decisions.
ID used to identify users for 24 hours after last activity
24 hours
_gat
Used to monitor number of Google Analytics server requests when using Google Tag Manager
1 minute
_gac_
Contains information related to marketing campaigns of the user. These are shared with Google AdWords / Google Ads when the Google Ads and Google Analytics accounts are linked together.
90 days
__utma
ID used to identify users and sessions
2 years after last activity
__utmt
Used to monitor number of Google Analytics server requests
10 minutes
__utmb
Used to distinguish new sessions and visits. This cookie is set when the GA.js javascript library is loaded and there is no existing __utmb cookie. The cookie is updated every time data is sent to the Google Analytics server.
30 minutes after last activity
__utmc
Used only with old Urchin versions of Google Analytics and not with GA.js. Was used to distinguish between new sessions and visits at the end of a session.
End of session (browser)
__utmz
Contains information about the traffic source or campaign that directed user to the website. The cookie is set when the GA.js javascript is loaded and updated when data is sent to the Google Anaytics server
6 months after last activity
__utmv
Contains custom information set by the web developer via the _setCustomVar method in Google Analytics. This cookie is updated every time new data is sent to the Google Analytics server.
2 years after last activity
__utmx
Used to determine whether a user is included in an A / B or Multivariate test.
18 months
_ga
ID used to identify users
2 years
_gali
Used by Google Analytics to determine which links on a page are being clicked
30 seconds
_ga_
ID used to identify users
2 years
SourceBuster is used by WooCommerce for order attribution based on user source.
Nazwa
Opis
Czas trwania
sbjs_session
The number of page views in this session and the current page path
30 minutes
sbjs_udata
Information about the visitor’s user agent, such as IP, the browser, and the device type
session
sbjs_first
Traffic origin information for the visitor’s first visit to your store (only applicable if the visitor returns before the session expires)
session
sbjs_current
Traffic origin information for the visitor’s current visit to your store
session
sbjs_first_add
Timestamp, referring URL, and entry page for your visitor’s first visit to your store (only applicable if the visitor returns before the session expires)
session
sbjs_current_add
Timestamp, referring URL, and entry page for your visitor’s current visit to your store
session
sbjs_migrations
Technical data to help with migrations between different versions of the tracking feature