Де зберігаються налаштування PHP
Параметри PHP можна задавати в кількох місцях. Пріоритет (від вищого до нижчого): ini_set() у коді → .user.ini → .htaccess → php.ini. Зміни в php.ini вимагають перезапуску PHP-FPM.
Ключові параметри PHP
| Параметр | За замовчуванням | Рекомендується | Опис |
|---|---|---|---|
memory_limit | 128M | 256–512M | Ліміт пам'яті на один PHP-процес |
upload_max_filesize | 2M | 64–256M | Максимальний розмір файлу, що завантажується |
post_max_size | 8M | Більше за upload_max_filesize | Максимальний розмір POST-запиту |
max_execution_time | 30 | 60–300 | Максимальний час виконання скрипта (сек) |
max_input_time | 60 | 120–300 | Час на отримання вхідних даних |
max_input_vars | 1000 | 3000–5000 | Максимум змінних у POST/GET/COOKIE |
Зміна через php.ini
# Знайти актуальний php.ini
php --ini
# Редагувати (для PHP-FPM)
sudo nano /etc/php/8.2/fpm/php.inimemory_limit = 512M
upload_max_filesize = 128M
post_max_size = 130M
max_execution_time = 300
max_input_time = 300
max_input_vars = 5000Зміна через .user.ini (для shared hosting)
Створіть файл .user.ini у корені сайту:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 68M
max_execution_time = 120Зміна через .htaccess (для Apache)
php_value memory_limit 256M
php_value upload_max_filesize 64M
php_value post_max_size 68M
php_value max_execution_time 120Зміна в коді PHP (тимчасово)
<?php
ini_set('memory_limit', '512M');
ini_set('max_execution_time', '300');
set_time_limit(300);Застосування змін php.ini
sudo systemctl reload php8.2-fpm
# Перевірка застосованих значень
php -r "echo ini_get('memory_limit');"wp-config.php: define('WP_MEMORY_LIMIT', '256M'); — це встановлює ліміт пам'яті для WordPress, але він не може перевищити системний memory_limit у php.ini.Реальні помилки та їх розбір
Allowed memory size exhausted
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/html/index.php on line 42134217728 байт — це 128 МБ, значення memory_limit за замовчуванням. Скрипт запросив ще один блок пам'яті (у прикладі — 20480 байт) і вперся у стелю. Типові причини: завантаження великого файлу в змінну цілком, обробка масиву з тисяч записів без генераторів, витік пам'яті в циклі. Підняття memory_limit лікує симптом, але якщо споживання зростає з кожним запуском — шукайте витік, а не збільшуйте ліміт без кінця.
Maximum execution time exceeded
Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/html/import.php on line 15Скрипт виконувався довше, ніж дозволяє max_execution_time. Це час роботи самого PHP, а не очікування клієнта. Для тривалих імпортів правильніше не піднімати ліміт до нескінченності на весь сайт, а виносити завдання в чергу — наприклад, через окремий пул PHP-FPM із власними таймаутами, — де max_execution_time можна сміливо ставити в 0.
POST Content-Length exceeds the limit
PHP Warning: POST Content-Length of 15728640 bytes exceeds the limit of 8388608 bytes in Unknown on line 0Рядок in Unknown on line 0 — не баг, а особливість: PHP відхиляє тіло запиту ще до передачі керування коду, тому файлу й номера рядка просто немає. За цієї помилки весь масив $_POST буде порожнім, а не лише файл — це часто плутає під час налагодження звичайних форм.
Коли правки php.ini не допомагають
- Сайт працює через Nginx — тіло запиту обрізається на рівні вебсервера директивою
client_max_body_sizeще до того, як дійде до PHP-FPM. Перевірте і її. - Хостинг запускає PHP як CGI під suPHP/suexec — там
.htaccessізphp_valueзазвичай ігнорується, працює лише.user.ini. .user.iniпідхоплюється не миттєво: інтервал перечитування задаєuser_ini.cache_ttl(за замовчуванням 300 секунд). Одразу після правки старе значення може ще діяти.- Директива позначена як
PHP_INI_SYSTEM(наприклад,disable_functions) — такі параметри не можна змінити через.htaccess,.user.iniчиini_set(), тільки через php.ini і перезапуск FPM.
Перевірка результату
Створіть тимчасовий файл info.php із phpinfo() і відкрийте його в браузері — там для кожної директиви є дві колонки:
| Колонка | Що означає |
|---|---|
| Local Value | Значення для поточного скрипта — те, що реально спрацює |
| Master Value | Значення з php.ini — базове, до перевизначень у .htaccess, .user.ini чи коді |
Якщо Local Value не збігається з очікуваним — правка не долетіла: перевірте, чи той php.ini редагували (php --ini у консолі та phpinfo() у браузері можуть вказувати на різні файли для CLI і FPM), і чи не забули перезавантажити FPM.
# Швидка перевірка без браузера
php -i | grep -E "memory_limit|upload_max_filesize|post_max_size"
# Перевірка вебверсії через curl до тестового info.php
curl -s https://example.com/info.php | grep -A1 "upload_max_filesize"Після перевірки обов'язково видаліть info.php — phpinfo() розкриває версії ПЗ, шляхи та змінні оточення, полегшуючи розвідку зловмиснику.