Налаштування файлу php.ini: Повний посібник з оптимізації PHP на вашому сервері
Файл php.ini — це головний файл конфігурації для PHP — основа майже кожного сучасного веб-додатку. Незалежно від того, чи ви запускаєте WordPress, Laravel, Magento або користувацький додаток, розуміння того, як правильно налаштувати php.ini, може значно покращити продуктивність вашого сервера, посилити безпеку та забезпечити безперебійну сумісність з вашим стеком програмного забезпечення.
Цей комплексний посібник проведе вас через все, що вам потрібно знати: що робить php.ini, як його знайти, як безпечно його редагувати та як перевірити, що ваші зміни працюють правильно.
1. Що таке php.ini і чому це важливо?
Файл php.ini — це звичайний текстовий файл конфігурації, який PHP читає кожного разу при ініціалізації. Він містить сотні директив — пар ключ-значення, які контролюють практично кожен аспект поведінки PHP під час виконання, включаючи:
- Розподіл пам’яті для скриптів
- Обмеження завантаження файлів і розміри даних POST
- Рівні звітування про помилки і логування
- Параметри управління сеансами
- Завантаження розширень (наприклад, PDO, cURL, OPcache)
- Обмеження безпеки, такі як
disable_functionsіopen_basedir - Обмеження часу виконання для запобігання неконтрольованим скриптам
Правильне налаштування цих параметрів — це не просто питання зручності — це безпосередньо впливає на стабільність вашої програми, стан безпеки та досвід користувача. Неправильно налаштовані параметри PHP є однією з основних причин помилок програми, невдалих завантажень файлів, збоїв через вичерпання пам’яті та вразливостей безпеки.
Якщо ви розміщуєте свої PHP-програми на плані VPS Hosting, у вас є повний доступ root для вільного змінення php.ini — що дає вам повний контроль над вашим PHP-середовищем.
2. Розташування файлу php.ini
Розташування php.ini залежить від вашої операційної системи, версії PHP та Server API (SAPI), що використовується (Apache mod_php, PHP-FPM або CLI). Ось три надійні методи для його пошуку.
Метод 1: Використання командного рядка (найшвидший метод)
Відкрийте термінал або підключіться через SSH та виконайте:
php --iniПриклад виходу:
Configuration File (php.ini) Path: /etc/php/8.2/cli
Loaded Configuration File: /etc/php/8.2/cli/php.ini
Scan for additional .ini files in: /etc/php/8.2/cli/conf.d
Additional .ini files parsed: /etc/php/8.2/cli/conf.d/10-opcache.ini, ...> Важливо: PHP часто має окремі файли php.ini для різних SAPI. Версія CLI (/etc/php/8.2/cli/php.ini) використовується при запуску PHP з командного рядка, тоді як версія Apache або PHP-FPM (/etc/php/8.2/apache2/php.ini або /etc/php/8.2/fpm/php.ini) використовується для веб-запитів. Завжди редагуйте правильний файл для вашого випадку.
Метод 2: Використання phpinfo() у браузері
Цей метод показує точно, який файл php.ini завантажує ваш веб-сервер — що може відрізнятися від версії CLI.
Крок 1: Створіть новий файл у кореневій папці вашого веб-сайту:
sudo nano /var/www/html/info.phpКрок 2: Додайте наступний вміст:
<?php
phpinfo();
?>Крок 3: Збережіть файл, потім відкрийте браузер і перейдіть на:
http://yourdomain.com/info.phpКрок 4: Знайдіть рядок “Loaded Configuration File” біля верхньої частини виходу. Він відобразить повний шлях до активного файлу php.ini.
> ⚠️ Попередження про безпеку: Видаліть info.php одразу після використання. Цей файл розкриває конфіденційні деталі конфігурації сервера, які можуть використовуватися зловмисниками.
sudo rm /var/www/html/info.phpМетод 3: Використання php -r (швидка одна команда)
php -r "echo php_ini_loaded_file();"Це виводить шлях завантаженого файлу php.ini безпосередньо в ваш термінал — без необхідності створення файлу.
Типові розташування php.ini за платформами
| Платформа / Налаштування | Типовий шлях php.ini |
|---|---|
| Ubuntu/Debian + Apache (PHP 8.2) | /etc/php/8.2/apache2/php.ini |
| Ubuntu/Debian + PHP-FPM (PHP 8.2) | /etc/php/8.2/fpm/php.ini |
| Ubuntu/Debian + CLI (PHP 8.2) | /etc/php/8.2/cli/php.ini |
| CentOS/RHEL + Apache | /etc/php.ini |
| cPanel/WHM | /usr/local/lib/php.ini |
| Windows (XAMPP) | C:xamppphpphp.ini |
| macOS (Homebrew PHP 8.2) | /opt/homebrew/etc/php/8.2/php.ini |
3. Редагування файлу php.ini
Крок 1: Спочатку створіть резервну копію
Перед внесенням будь-яких змін завжди створюйте резервну копію:
sudo cp /etc/php/8.2/apache2/php.ini /etc/php/8.2/apache2/php.ini.bakЦе дозволяє вам швидко відновити вихідну конфігурацію, якщо щось піде не так.
Крок 2: Відкрийте файл у текстовому редакторі
Використовуйте nano для зручного досвіду для початківців:
sudo nano /etc/php/8.2/apache2/php.iniАбо використовуйте vim для більш просунутого редагування:
sudo vim /etc/php/8.2/apache2/php.iniКрок 3: Навігація та редагування директив
Файл php.ini великий (часто 1500+ рядків). Використовуйте функцію пошуку вашого редактора, щоб перейти до конкретних директив:
- У
nano: НатиснітьCTRL + W, потім введіть назву директиви (наприклад,memory_limit) - У
vim: Натисніть/, потім введіть назву директиви
Крок 4: Збереження та вихід
- nano: Натисніть
CTRL + X, потімY, потімEnter - vim: Натисніть
ESC, введіть:wq, потім натиснітьEnter
4. Ключові директиви php.ini пояснені
Ось детальний розбір найважливіших php.ini директив, які ви повинні знати та налаштувати:
Обмеження пам’яті та ресурсів
; Maximum memory a single PHP script can allocate
memory_limit = 256M
; Maximum time (in seconds) a script is allowed to run
max_execution_time = 60
; Maximum time PHP will spend parsing request data
max_input_time = 120
; Maximum number of input variables (important for complex forms)
max_input_vars = 3000Параметри завантаження файлів
; Whether file uploads are permitted
file_uploads = On
; Maximum size of an individual uploaded file
upload_max_filesize = 64M
; Maximum size of all POST data (must be >= upload_max_filesize)
post_max_size = 64M
; Maximum number of files that can be uploaded simultaneously
max_file_uploads = 20> Практичне правило: post_max_size завжди повинна бути рівною або більшою за upload_max_filesize. Якщо post_max_size менша, завантаження файлів мовчки не вдадуться.
Звітування про помилки та логування
; ---- DEVELOPMENT ENVIRONMENT ----
; Show all errors on screen (never use in production)
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
; ---- PRODUCTION ENVIRONMENT ----
; Log errors to a file, never display them to users
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.logУправління сеансами
; Where session data is stored on the server
session.save_path = "/var/lib/php/sessions"
; Session cookie lifetime in seconds (0 = until browser closes)
session.cookie_lifetime = 0
; Prevent JavaScript from accessing session cookies (XSS protection)
session.cookie_httponly = On
; Only send session cookies over HTTPS
session.cookie_secure = On
; Strict session ID mode (prevents session fixation attacks)
session.use_strict_mode = OnOPcache (прискорювач продуктивності)
OPcache значно покращує продуктивність PHP, зберігаючи попередньо скомпільований байт-код скриптів у спільній пам’яті:
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 15. Перезавантаження вашого веб-сервера
Зміни до php.ini не набирають чинності, поки ви не перезавантажите відповідний сервіс. Використовуйте відповідну команду для вашої конфігурації:
Apache (mod_php)
sudo systemctl restart apache2
# or on CentOS/RHEL:
sudo systemctl restart httpdNginx + PHP-FPM
# Restart PHP-FPM (replace 8.2 with your PHP version)
sudo systemctl restart php8.2-fpm
# Restart Nginx
sudo systemctl restart nginxGraceful Reload (Zero Downtime)
Для виробничих серверів використовуйте graceful reload, щоб уникнути розриву активних з’єднань:
# Apache graceful reload
sudo systemctl reload apache2
# PHP-FPM graceful reload
sudo systemctl reload php8.2-fpmПеревірка запуску сервісів
sudo systemctl status apache2
sudo systemctl status php8.2-fpm6. Перевірка ваших змін
Після перезавантаження сервера підтвердіть, що ваші нові параметри активні, використовуючи один із цих методів:
Метод 1: Command Line Grep
# Check memory_limit
php -i | grep memory_limit
# Check upload_max_filesize
php -i | grep upload_max_filesize
# Check multiple values at once
php -i | grep -E 'memory_limit|upload_max_filesize|post_max_size|max_execution_time'Метод 2: phpinfo() Page
Тимчасово створіть файл info.php (не забудьте видалити його потім) і шукайте ваші змінені директиви. Змінені значення з’являтимуться в колонках "Local Value" та "Master Value".
Метод 3: PHP One-Liner
php -r "echo ini_get('memory_limit');"7. Поширені поради з оптимізації php.ini
Використання .htaccess для перевизначення php.ini (лише Apache)
Якщо ви на спільному хостингу або не маєте доступу root, ви можете перевизначити певні php.ini параметри через .htaccess:
php_value memory_limit 256M
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 120> Примітка: це працює лише якщо AllowOverride увімкнено і хостинг-провайдер дозволяє перевизначення директив PHP.
Використання ini_set() у коді PHP
Для параметрів, специфічних для додатку, ви можете перевизначити php.ini значення під час виконання у ваших скриптах PHP:
<?php
ini_set('memory_limit', '512M');
ini_set('max_execution_time', '300');
?>Файли php.ini для кожної директорії (PHP-FPM)
З PHP-FPM ви можете застосувати різні php.ini параметри до різних віртуальних хостів або директорій, налаштовуючи файли пулу в /etc/php/8.2/fpm/pool.d/. Це особливо корисно при розміщенні кількох додатків з різними вимогами.
Якщо ви керуєте кількома PHP додатками, VPS з cPanel значно спрощує керування параметрами PHP для кожного домену через графічний інтерфейс без ручного редагування файлів конфігурації.
8. Посилення безпеки через php.ini
Правильна конфігурація php.ini — один з найефективніших способів посилити ваше PHP середовище проти поширених атак.
Вимкніть небезпечні функції
; Prevent execution of system commands from PHP scripts
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_sourceОбмежте доступ до файлової системи
; Limit PHP file access to specific directories
open_basedir = /var/www/html:/tmpПриховайте інформацію про версію PHP
; Don't expose PHP version in HTTP headers
expose_php = OffВимкніть віддалене включення файлів
; Prevent PHP from including remote URLs (common attack vector)
allow_url_fopen = Off
allow_url_include = OffПосиліть безпеку сесій
session.cookie_httponly = On
session.cookie_secure = On
session.use_strict_mode = On
session.cookie_samesite = "Strict"> Корисна порада: Якщо ви запускаєте сайт електронної комерції або обробляєте конфіденційні дані користувачів, поєднайте вашу посилену php.ini з дійсним SSL сертифікатом для шифрування всіх даних під час передачі. HTTPS є обов’язковим для того, щоб session.cookie_secure = On працював правильно.
9. Поширені помилки php.ini, яких слід уникати
| Помилка | Чому це проблема | Виправлення |
|---|---|---|
Встановлення memory_limit = -1 у production | Дозволяє скриптам споживати невмежену RAM, що призводить до збоїв сервера | Встановіть розумну межу, наприклад 256M або 512M |
display_errors = On у production | Розкриває конфіденційні шляхи файлів та облікові дані бази даних користувачам | Встановіть на Off та використовуйте log_errors = On замість цього |
post_max_size < upload_max_filesize | Викликає мовчазні збої завантаження | Завжди встановлюйте post_max_size ≥ upload_max_filesize |
Редагування неправильного php.ini | Зміни не застосовуються до веб-запитів | Використовуйте phpinfo() для підтвердження того, який файл завантажується вашим веб-сервером |
| Невідновлення сервера після змін | Старі параметри залишаються активними | Завжди перезавантажуйте Apache або PHP-FPM після редагування |
Залишення info.php на сервері | Розкриває повну конфігурацію сервера зловмисникам | Видаліть негайно після використання |
Встановлення allow_url_include = On | Дозволяє атаки Remote File Inclusion (RFI) | Завжди тримайте це Off |
10. Висновок
Оволодіння конфігурацією php.ini є фундаментальною навичкою для будь-якого системного адміністратора або веб-розробника. Правильні параметри можуть означати різницю між повільним, вразливим сервером та швидким, безпечним, готовим до виробництва середовищем.
Для підсумування ключових висновків:
- Завжди робіть резервну копію
php.iniперед внесенням змін - Визначте правильний файл — CLI та веб-сервер SAPI часто використовують різні файли
php.ini - Налаштуйте обмеження ресурсів (
memory_limit,max_execution_time,upload_max_filesize) відповідно до потреб вашої програми - Посиліть безпеку, вимкнувши небезпечні функції, приховавши інформацію про версію та обмеживши доступ до файлів
- Увімкніть OPcache для значного підвищення продуктивності
- Ніколи не виводьте помилки у виробництві — замість цього логуйте їх
- Перезавантажте веб-сервер після кожної зміни та перевірте за допомогою
phpinfo()абоphp -i
Середовище хостингу, яке ви обираєте, також відіграє важливу роль у тому, наскільки контролю ви маєте над конфігурацією PHP. З Виділеними серверами від AlexHost ви отримуєте повний, необмежений доступ до конфігурації PHP вашого сервера — ідеально для високонавантажених програм зі складними вимогами. Для менших проектів або команд, які тільки починають, плани Спільного веб-хостингу забезпечують керовані середовище, де багато параметрів PHP попередньо оптимізовані для вас.
Регулярно переглядайте конфігурацію php.ini у міру розвитку вашої програми, оновлення версій PHP та зміни закономірностей трафіку. Добре налаштоване середовище PHP — це не одноразове налаштування — це постійна практика, яка приносить дивіденди в продуктивності, надійності та безпеці.
на всіх хостингових послугах