Включение PHP: настройка расширений и отладки
Включение PHP (активация интерпретатора) необходимо для обработки скриптов на веб-сервере или в командной строке. В зависимости от окружения используются различные методы: подключение модуля к Apache, настройка FastCGI для Nginx, изменение php.ini или временные параметры через CLI. Ниже рассмотрены основные и альтернативные способы.
Основное решение: подключение модуля PHP к Apache
Наиболее распространённый способ для серверов Apache - использование модуля mod_php. После установки PHP (например, пакет php8.1) модуль активируется командой:
sudo a2enmod php8.1
sudo systemctl restart apache2
Если используется многопроцессорный модуль (MPM), необходимо включить prefork (a2enmod mpm_prefork). После перезапуска сервер будет обрабатывать файлы .php. Проверить статус можно через phpinfo().
Типичная ошибка: 'Module php8.1 does not exist'. Причина - не установлен пакет libapache2-mod-php. Решение: выполнить sudo apt install libapache2-mod-php8.1.
Варианты включения PHP
Как включить конкретное расширение PHP через php.ini?
Цель: добавить поддержку функций (curl, mbstring, gd и т.д.). В файле php.ini найдите параметр extension_dir (путь к папке с .so-файлами) и раскомментируйте строку с нужным расширением:
extension=curl
extension=mbstring
extension=gd
После сохранения перезапустите веб-сервер или PHP-FPM. Проверьте через phpinfo().
Ошибка: 'PHP Warning: PHP Startup: Unable to load dynamic library'. Причины: расширение не скомпилировано для текущей версии PHP, отсутствует сам .so-файл или неправильный путь в extension_dir. Решение: установите пакет php-<extension> (например, sudo apt install php-curl) и проверьте корректность пути.
Как включить отображение ошибок PHP для отладки?
Для разработки полезно видеть все ошибки. В php.ini установите:
display_errors = On
error_reporting = E_ALL
Также можно включить вывод стартовых ошибок (display_startup_errors = On). На рабочем сервере эти параметры отключаются. Альтернатива - задать параметры в скрипте через ini_set('display_errors', '1').
Проблема: ошибки не выводятся, хотя параметры в php.ini установлены. Проверьте, какой файл php.ini используется (вывод php --ini). Возможно, изменения вносятся не в тот файл или требуется перезапуск сервера.
Как включить PHP для определённой папки через .htaccess?
Если нет доступа к основному конфигу Apache, можно использовать .htaccess. Добавьте в корень сайта:
AddHandler application/x-httpd-php .php
# или для конкретной поддиректории:
SetHandler application/x-httpd-php
Важно, чтобы в главном конфиге было разрешено переопределение (AllowOverride All).
Ошибка: 500 Internal Server Error. Проверьте синтаксис .htaccess и наличие модуля mod_rewrite или mime. Убедитесь, что AllowOverride не установлен в None.
Как включить PHP на сервере Nginx через PHP-FPM?
Nginx не обрабатывает PHP напрямую, для этого используется FastCGI-процесс PHP-FPM. В блоке server добавьте:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
Убедитесь, что PHP-FPM запущен (sudo systemctl start php8.1-fpm). Перезагрузите Nginx.
Типичная ошибка: 502 Bad Gateway. Причины: не запущен php-fpm, неверный сокет, версия PHP не совпадает с установленной. Проверьте статус службы и путь к сокету.
Как временно включить опцию PHP при запуске скрипта из командной строки?
Для одноразовой отладки можно задать параметры через ключ -d без изменения php.ini:
php -d display_errors=1 -d error_reporting=E_ALL script.php
Цель: проверить поведение скрипта с определёнными настройками, не вмешиваясь в глобальную конфигурацию. Удобно для тестирования.
Особенность: некоторые опции (например, disable_functions) нельзя переопределить из командной строки, они блокируются системным php.ini.
Расширенные примеры конфигураций
Пример 1: Включение нескольких опций в php.ini для разработки
; Включаем отображение всех ошибок
display_errors = On
error_reporting = E_ALL | E_STRICT
; Включаем расширения
extension=curl
extension=mbstring
extension=gd
; Увеличиваем лимиты
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 16M
; Включаем OPcache
[opcache]
opcache.enable=1
opcache.memory_consumption=128
После перезапуска сервера phpinfo() покажет новые значения. Пример вывода (фрагмент): display_errors = On (local value: On, master value: On) error_reporting = 32767 (E_ALL | E_STRICT) memory_limit = 256M
Пример 2: Переключение между версиями PHP в Apache
# Отключить PHP 7.4 и включить PHP 8.1
sudo a2dismod php7.4
sudo a2enmod php8.1
sudo systemctl restart apache2
Проверка версии через phpinfo() покажет PHP 8.1. Если модули не найдены, пакеты libapache2-mod-php* должны быть установлены.
Пример 3: Настройка Nginx с PHP-FPM и передача переменных
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_intercept_errors on;
}
После перезагрузки Nginx скрипты PHP выполняются. При ошибке 502 проверяем статус php-fpm: systemctl status php8.1-fpm.
Пример 4: Включение расширения через сборку из исходников (phpize)
# Устанавливаем php8.1-dev и инструменты
sudo apt install php8.1-dev
# Скачиваем исходный код расширения (например, redis)
wget https://pecl.php.net/get/redis-5.3.7.tgz
tar -xzf redis-5.3.7.tgz
cd redis-5.3.7
phpize && ./configure && make && sudo make install
# В php.ini добавляем extension=redis
После добавления строки и перезапуска сервера в phpinfo() появится раздел redis.
Пример 5: Включение строгой типизации глобально через auto_prepend_file
; В php.ini добавляем
auto_prepend_file = /etc/php/strict_types.php
; Содержимое файла strict_types.php:
<?php
declare(strict_types=1);
Теперь все скрипты будут выполняться в режиме строгих типов. Это полезно для проектов, требующих строгой типизации.