Сбой в работе PHP и его исправление
Когда веб-приложение сообщает, что PHP не запущен (php is not running), необходимо проверить несколько компонентов системы. Ниже приведены основные способы решения.
Диагностика ошибки 'PHP не запущен'
Как проверить состояние PHP-FPM и перезапустить службу?
Наиболее часто ошибка возникает, если PHP-FPM (FastCGI Process Manager) не работает или не настроен. Убедитесь, что служба активна, и при необходимости перезапустите её. Пример для PHP 8.2:
sudo systemctl status php8.2-fpm
sudo systemctl restart php8.2-fpmPhp is not running (php не запущен)
Active: active (running) since ... ... Process: ...
Также проверьте, слушает ли PHP-FPM нужный порт (по умолчанию 9000):
sudo netstat -tlnp | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 12345/php-fpm
Типичные проблемы и ошибки:
- Если команда
systemctlне найдена, вероятно, используется другой менеджер служб (например,serviceилиinit.d). Попробуйтеsudo service php8.2-fpm status. - Ошибка
Unit php8.2-fpm.service not foundозначает, что PHP-FPM не установлен. - Если после перезапуска статус показывает
failed, проверьте конфигурационные файлы на синтаксис:sudo php-fpm8.2 -t.
Как установить PHP, если он отсутствует?
Если PHP не найден, его необходимо установить. Примеры для разных дистрибутивов:
# Ubuntu/Debian
sudo apt update
sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl
# CentOS/RHEL
sudo yum install epel-release
sudo yum install php php-fpm php-mysqlnd
Типичные проблемы:
- Конфликты версий: если уже установлена другая версия PHP, используйте
apt-cache policy phpилиyum list phpдля выбора. - Ошибка
Package not found- добавьте репозиторий (например, ondrej/php для Ubuntu).
Как настроить веб-сервер Apache для обработки PHP?
Убедитесь, что модуль мод_php включён. Для Apache 2.4:
sudo a2enmod php8.2
sudo systemctl restart apache2
Проверьте, что в конфигурации виртуального хоста есть строка обработки файлов .php:
AddType application/x-httpd-php .php
DirectoryIndex index.php
Типичные ошибки:
- Файл PHP скачивается вместо выполнения - отсутствует директива
AddTypeили модуль не загружен. - Ошибка 500 - проверьте синтаксис php.ini или наличие недопустимых директив.
Как настроить Nginx в связке с PHP-FPM?
В конфигурации сервера Nginx добавьте location для PHP-файлов:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
После изменений перезагрузите Nginx:
sudo nginx -t
sudo systemctl reload nginx
Типичные ошибки:
- 502 Bad Gateway - PHP-FPM не запущен или не слушает сокет/порт.
- timeout - увеличьте параметры
fastcgi_read_timeoutилиrequest_terminate_timeoutв пуле PHP-FPM.
Как использовать встроенный сервер PHP для проверки?
Встроенный сервер PHP позволяет быстро протестировать работу без полноценного веб-сервера:
php -S 0.0.0.0:8080 -t /var/www/html
Затем откройте в браузере http://localhost:8080/info.php (если создан файл с phpinfo()).
Типичные проблемы:
- Сервер запускается, но файлы не обрабатываются - укажите правильный корневой каталог (
-t). - Порт занят - измените порт, например 8081.
Где искать логи ошибок PHP?
Логи помогают понять причину проблемы. Основные расположения:
/var/log/php-fpm/error.log
/var/log/apache2/error.log
/var/log/nginx/error.log
Чтобы включить лог ошибок в самом PHP, добавьте в php.ini:
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = /tmp/php_errors.log
Типичные проблемы:
- Лог-файл не создаётся - проверьте права на запись для каталога.
- Файл пуст - возможно, ошибки не возникают или они выводятся на экран (display_errors).
Как проверить права доступа к файлам и папкам?
PHP-скрипты могут не выполняться из-за неверных прав. Убедитесь, что файлы принадлежат пользователю веб-сервера (www-data, apache, nginx):
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
Проверьте также директиву open_basedir в php.ini, которая ограничивает доступ к файловой системе.
Типичные ошибки:
- Ошибка
open_basedir restriction in effect- снимите ограничение или расширьте путь. - Access denied - проверьте права на каталог сессий (/var/lib/php/sessions).
Как создать тестовый файл phpinfo()?
Создайте файл info.php с содержимым:
<? phpinfo(); ?>
Откройте его в браузере (http://ваш-сервер/info.php). Если страница пуста или предлагает скачать файл, значит PHP не обрабатывается.
Типичные проблемы:
- Файл скачивается - веб-сервер не настроен на выполнение PHP.
- Пустая страница - ошибка в самом PHP (проверьте логи, включите display_errors).
Расширенные примеры кода и команд
Пример 1: Полная установка PHP 8.2 на Ubuntu с модулями и запуск PHP-FPM
Команды установки всех необходимых пакетов:
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
sudo apt install -y php8.2 php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl php8.2-mbstring php8.2-zip php8.2-gd php8.2-intl
Reading package lists... Done Building dependency tree... Done The following NEW packages will be installed: php8.2 php8.2-cli php8.2-common php8.2-fpm ... ...
Затем запустите PHP-FPM и добавьте в автозагрузку:
sudo systemctl enable php8.2-fpm
sudo systemctl start php8.2-fpm
sudo systemctl status php8.2-fpm
● php8.2-fpm.service - PHP 8.2 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php8.2-fpm.service; enabled; vendor preset: enabled) Active: active (running) since ...
Пример 2: Настройка виртуального хоста Apache с поддержкой .htaccess и обработкой ошибок
Создайте файл конфигурации /etc/apache2/sites-available/example.conf:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
<Directory /var/www/example>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Активируйте сайт и перезагрузите Apache:
sudo a2ensite example.conf
sudo systemctl reload apache2
Enabling site example. To activate the new configuration, you need to run: systemctl reload apache2
Пример 3: Конфигурация Nginx для нескольких пулов PHP-FPM
Определите upstream с разными сокетами для разных приложений:
upstream php_backend {
server unix:/run/php/php8.2-fpm.sock weight=2;
server unix:/run/php/php7.4-fpm.sock weight=1;
}
server {
listen 80;
server_name example.com;
root /var/www/example;
index index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass php_backend;
fastcgi_read_timeout 120;
}
}
Проверьте конфигурацию и перезагрузите:
sudo nginx -t
sudo systemctl reload nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Пример 4: Встроенный сервер PHP с маршрутизатором (router.php)
Создайте файл router.php для обработки всех запросов:
<?
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('/\.php$/', $uri)) {
// выполнить PHP-файл
return false;
}
// в противном случае отдать статический файл или 404
echo "Router: $uri";
?>
Запустите сервер с роутером:
php -S 127.0.0.1:8080 -t /var/www/html router.php
Откройте http://127.0.0.1:8080/any-path - в ответе будет Router: /any-path.
Пример 5: Отлов ошибок PHP и запись в лог-файл
Создайте файл test_errors.php:
<?
// Включаем максимальный уровень отчёта
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/tmp/php_errors.log');
// Генерируем ошибку
trigger_error('Тестовое уведомление', E_USER_NOTICE);
// Вызов несуществующей функции
undefined_function();
?>
После выполнения проверьте файл лога:
cat /tmp/php_errors.log
[28-Mar-2025 12:00:00 UTC] PHP Notice: Тестовое уведомление in /var/www/html/test_errors.php on line 9
[28-Mar-2025 12:00:00 UTC] PHP Fatal error: Uncaught Error: Call to undefined function undefined_function() in /var/www/html/test_errors.php:10
Stack trace:
#0 {main}
thrown in /var/www/html/test_errors.php on line 10
Пример 6: Проверка работы PHP через curl из командной строки
Создайте файл info.php:
<? phpinfo(); ?>
Выполните запрос:
curl -I http://localhost/info.php
HTTP/1.1 200 OK Server: nginx/1.24.0 Content-Type: text/html; charset=UTF-8 ...
Если в ответе Content-Type: text/html и статус 200, PHP отрабатывает корректно. Если получаете application/octet-stream или 404, значит веб-сервер не обрабатывает PHP.