Сбой в работе PHP и его исправление

Раздел: Администрирование 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-fpm

Php 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.

PHP не запущен - comments

En
Php is not running (php)