1

PHP скрипты не выполняются - настройка веб сервера

Раздел: Решение проблем с PHP -> Диагностика ошибок PHP

Основное и самое эффективное решение

Как настроить веб сервер, чтобы PHP файлы выполнялись?

Наиболее частая причина скачивания PHP файлов - отсутствие обработчика для расширения .php в конфигурации веб сервера. Для Apache необходимо добавить директиву AddHandler или SetHandler. Для Nginx - настроить fastcgi_pass. Ниже приведены примеры для популярных серверов.

# Apache (mod_php)
AddHandler application/x-httpd-php .php

файлы php скачиваются (проблема: php-файлы скачиваются вместо выполнения)

# Nginx + PHP-FPM
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

не могу записать файл restore php (проблема с записью файла restore.php)

Проверить результат можно, создав файл test.php с содержимым <?php phpinfo(); ?>. Если после настройки появляется ошибка 500, проверьте пути к модулям и права на файлы.

Типичные ошибки:

  • Ошибка 500 - часто из-за неверного пути к модулю или отсутствия самого модуля. Для Apache проверьте наличие LoadModule php_module.
  • Файл .php отдается как текст - если сервер все равно не исполняет, возможно, директива не попала в конфигурацию (например, .htaccess не разрешен).

Проверка установки модуля PHP в Apache

Перед настройкой убедитесь, что сам модуль PHP установлен и загружен. Выполните команду:

apache2ctl -M | grep php

не работает php файл (не работает php-файл (ошибка выполнения))

Если вывод пустой, установите PHP и модуль:

sudo apt install php libapache2-mod-php

Возможные проблемы:

После установки может потребоваться перезапуск Apache (systemctl restart apache2).

Настройка через .htaccess при отсутствии доступа к основному конфигу

Если у вас нет прав на редактирование конфигурации сервера, можно использовать файл .htaccess в корневой директории сайта. Добавьте строку:

AddType application/x-httpd-php .php

Убедитесь, что в основном конфиге разрешена директива AllowOverride All для данной директории.

Проблема:

.htaccess может игнорироваться, если AllowOverride установлен в None или FileInfo не разрешен. Проверьте настройки виртуального хоста.

Настройка Apache с PHP-FPM (модный способ)

При использовании PHP-FPM вместо mod_php, необходимо настроить проксирование запросов к PHP-FPM через mod_proxy_fcgi. Пример директивы в виртуальном хосте:

<FilesMatch \.php$>
    SetHandler 'proxy:fcgi://127.0.0.1:9000'
</FilesMatch>

Или через ProxyPassMatch:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1

Типичные ошибки:

  • Ошибка 502 Bad Gateway - PHP-FPM не запущен или не слушает на указанном адресе/сокете. Проверьте статус: systemctl status php7.4-fpm.
  • Путь к файлу не соответствует реальному - проверьте директиву DocumentRoot.

Настройка Nginx с PHP-FPM

В конфигурации сервера Nginx для обработки PHP файлов необходимо определить location блок:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

Или с TCP соединением:

fastcgi_pass 127.0.0.1:9000;

Ошибки:

Если Nginx возвращает 404, проверьте, что корневой путь указан верно. Часто проблема в отсутствии директивы `try_files` в location.

Настройка IIS для выполнения PHP

В Windows IIS необходимо добавить обработчик для .php файлов через менеджер IIS или через web.config:

<configuration>
    <system.webServer>
        <handlers>
            <add name='PHP' path='*.php' verb='*' modules='FastCgiModule' scriptProcessor='C:\PHP\php-cgi.exe' resourceType='File' />
        </handlers>
    </system.webServer>
</configuration>

Проблемы:

Убедитесь, что установлен PHP для Windows и путь к php-cgi.exe указан верно. Также может потребоваться установка FastCGI модуля.

Проверка Content-Type в скрипте PHP

Иногда причина в том, что сам скрипт не передает правильный заголовок Content-Type. Например, если скрипт выводит текст без header, браузер может посчитать его как скачиваемый файл. Всегда рекомендуется в начале скрипта указывать:

<?php
header('Content-Type: text/html; charset=utf-8');
?>

Важно:

Это не решит проблему, если сервер не обрабатывает PHP вообще. Проверка заголовков через curl поможет диагностировать:

curl -I http://example.com/test.php

Если в ответе Content-Type: application/octet-stream или отсутствует, сервер не исполняет PHP.

Проверка расширения файла и пути

Убедитесь, что файл действительно имеет расширение .php, а не .php.txt или .php.bak. Некоторые серверы могут быть настроены только на конкретные расширения. Также проверьте, что файл находится в DocumentRoot.

Расширенные примеры настройки и диагностики

Ниже приведены подробные конфигурационные файлы и команды для различных серверов.

Пример полной конфигурации виртуального хоста Apache с mod_php

Пример
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    # Обработчик PHP
    AddHandler application/x-httpd-php .php
    # Дополнительно: директива для включения PHP
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
</VirtualHost>

Пример конфигурации Nginx с PHP-FPM (полный блок server)

Пример
server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ =404;
    }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
    location ~ /\.ht {
        deny all;
    }
}

Проверка HTTP заголовков с помощью curl

Пример
curl -I http://localhost/test.php
HTTP/1.1 200 OK
Date: ...
Content-Type: text/html; charset=UTF-8
...

Если Content-Type application/octet-stream или не указан, значит PHP не обрабатывается.

Создание информационного PHP скрипта

Пример
<?php
phpinfo();
?>

Результат (часть вывода):

PHP Version 7.4.33
Loaded Configuration File => /etc/php/7.4/cli/php.ini
...

Команда для проверки загруженного модуля PHP в Apache

Пример
apachectl -M 2>/dev/null | grep php
php7_module (shared)

Команда для проверки версии PHP CLI

Пример
php -v
PHP 8.1.2 (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies

Пример конфигурации PHP-FPM пула (www.conf)

Пример
[www]
user = www-data
group = www-data
listen = /run/php/php7.4-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Проверка активных процессов PHP-FPM

Пример
ps aux | grep php-fpm
www-data  ... /usr/sbin/php-fpm7.4
...

Если php-fpm не запущен, запустите службу:

Пример
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm

Пример отладки через лог ошибок Apache

Пример
tail -f /var/log/apache2/error.log

Типичная запись при ошибке с PHP-FPM:

[proxy_fcgi:error] AH01071: Got error 'Primary script unknown'

Использование консольной утилиты php для проверки синтаксиса скрипта

Пример
php -l test.php
No syntax errors detected in test.php

Пример исправления с помощью .user.ini (для CGI/FastCGI)

Пример
; .user.ini файл в корне сайта
; Не гарантирует выполнение, но может влиять на настройки
; Убедитесь, что сервер использует CGI/FastCGI
; Добавить обработчик нельзя, но можно установить error_reporting

Проблема: PHP-файлы скачиваются вместо выполнения - comments

En
файлы php скачиваются (php)