Причины и способы исправления ошибки недоступности PHP скриптов

Раздел: Администрирование -> Ошибки сервера

Почему страница PHP недоступна и как это исправить

Когда браузер выдаёт сообщение «Страница недоступна» или пустой белый экран, это часто означает, что сервер вернул HTTP-код 500 Internal Server Error. Причина - необработанная ошибка в выполняемом PHP-скрипте, неправильная конфигурация сервера или проблемы с правами доступа. Ниже приведены пошаговые решения, от самого быстрого до узконаправленных.

Как заставить PHP показывать ошибки прямо на экране?

Самый эффективный первый шаг - включить вывод всех ошибок на время отладки. Это позволяет увидеть точную причину сбоя.

Создайте файл debug.php в корне сайта со следующим содержимым:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Далее идёт код, который вызывает ошибку
require_once 'app.php';
?>

страница php недоступна (страница недоступна в php)

Затем обратитесь к этому файлу через браузер. Если ошибка синтаксическая и происходит до выполнения строк с ini_set, этот метод не сработает. В таком случае перейдите к настройкам в php.ini или .htaccess.

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

  • На некоторых хостингах display_errors блокируется на глобальном уровне. Тогда используйте логи.
  • После завершения отладки обязательно отключите вывод ошибок на рабочем сайте.

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

Используйте встроенный синтаксический анализатор из командной строки.

php -l /путь/к/файлу.php

Команда вернёт No syntax errors detected или укажет номер строки с ошибкой.

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

  • Команда не найдена - нужно установить PHP CLI.
  • Синтаксическая ошибка может скрываться в подключаемых файлах - проверяйте каждый файл отдельно.

Какие права доступа должны быть у PHP-файлов и папок?

Неверные права (например, 777 для скриптов) или отсутствие права на чтение у пользователя веб-сервера приводят к ошибке 500.

Установите правильные разрешения:

chmod 644 *.php          # файлы: чтение+запись владелец, чтение группа/все
chmod 755 каталоги       # папки: все права владельцу, чтение+выполнение остальным

Владелец файлов должен совпадать с пользователем, под которым работает веб-сервер (обычно www-data или nobody).

Распространённая ошибка:

После копирования файлов через FTP права часто сбиваются. Проверяйте их командой ls -la.

Как проверить файл .htaccess на наличие ошибок?

Некорректные директивы (например, RewriteRule с неправильным синтаксисом) вызывают внутреннюю ошибку сервера.

Временно переименуйте .htaccess в .htaccess.bak и проверьте, исчезнет ли ошибка. Если да - ищите проблемную строку.

# Пример ошибочной директивы:
RewriteRule ^page$ index.php?page=$1 [L]  # пропущен параметр

Правильная запись:

RewriteRule ^page$ index.php?page=page [L]

Сложность:

Ошибка может быть вызвана случайным пробелом или символом после закрывающего тега PHP.

Где искать логи ошибок PHP и веб-сервера?

Логи содержат точное описание ошибки, даже если вывод на экран отключён.

Для Apache (Debian/Ubuntu):

tail -f /var/log/apache2/error.log

Для Nginx:

tail -f /var/log/nginx/error.log

Логи PHP могут быть отдельно (укажите путь в php.ini):

error_log = /var/log/php_errors.log

Проблема:

На некоторых хостингах доступ к логам закрыт. Тогда используйте функцию error_log() в коде для записи в свой файл.

Как исправить ошибку «Allowed memory size exhausted»?

Когда скрипту не хватает оперативной памяти, PHP аварийно завершается.

Увеличьте лимит в php.ini или прямо в коде:

ini_set('memory_limit', '256M');

Для постоянного изменения найдите в php.ini строку:

memory_limit = 128M

и замените на 256M.

Типичная ошибка:

Увеличение лимита не поможет, если утечка памяти вызвана бесконечным циклом или рекурсией - сначала исправьте алгоритм.

Как отловить ошибки с помощью try-catch и кастомного обработчика?

Перехват исключений позволяет корректно обработать сбой и вывести понятное сообщение.

<?php
set_error_handler(function($errno, $errstr) {
    throw new ErrorException($errstr, 0, $errno);
});

try {
    // Код, который может упасть
    $result = 10 / 0;
} catch (ErrorException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>

Такой подход заменяет стандартные уведомления на управляемые исключения.

Ограничение:

Фатальные ошибки (например, вызов неопределённой функции) не могут быть перехвачены обычным set_error_handler. Для них используйте register_shutdown_function.

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

Пример 1. Проверка прав доступа с выводом отчёта

Скрипт проверяет, может ли сервер читать необходимые файлы.

Пример
<?php
$files = [
    'config.php',
    'index.php',
    'templates/header.php'
];

foreach ($files as $file) {
    if (!file_exists($file)) {
        echo "Файл $file не найден\n";
    } elseif (!is_readable($file)) {
        echo "Файл $file не читается (права: " . substr(sprintf('%o', fileperms($file)), -4) . ")\n";
    } else {
        echo "Файл $file доступен\n";
    }
}
?>
Файл config.php не читается (права: 0640)
Файл index.php доступен
Файл templates/header.php доступен

Решение - исправить права chmod 644 config.php.

Пример 2. Логирование всех ошибок в собственный файл

Создание обработчика, который записывает ошибки в my_errors.log с временной меткой.

Пример
<?php
function customErrorHandler($errno, $errstr, $errfile, $errline) {
    $log = "[" . date('Y-m-d H:i:s') . "] Ошибка ($errno): $errstr в $errfile:$errline\n";
    file_put_contents('my_errors.log', $log, FILE_APPEND);
    return true; // не передаём управление стандартному обработчику
}

set_error_handler('customErrorHandler');

// Провокация ошибки
echo $undefinedVar;
?>
В файле my_errors.log появится запись:
[2025-04-09 10:30:15] Ошибка (8): Undefined variable: undefinedVar в /var/www/test.php:12

Этот метод полезен, когда нельзя менять php.ini.

Пример 3. Использование .htaccess для включения отображения ошибок

Если нет доступа к php.ini, настройки можно задать через .htaccess.

Пример
# Включить вывод ошибок для всех PHP-файлов
php_flag display_errors on
php_value error_reporting 32767  # E_ALL

Сохраните в файл .htaccess в корне сайта. Проверьте, что модуль mod_rewrite включён, иначе сервер проигнорирует директивы.

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

На некоторых хостингах директивы php_flag запрещены. Тогда используйте php_value с осторожностью.

Пример 4. Обработка фатальных ошибок через register_shutdown_function

Фатальные ошибки (например, вызов неопределённого класса) не ловятся через set_error_handler. Их можно перехватить при завершении скрипта.

Пример
<?php
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error !== null && ($error['type'] === E_ERROR || $error['type'] === E_PARSE)) {
        echo "Фатальная ошибка: {$error['message']} в файле {$error['file']} на строке {$error['line']}";
        // Отправить уведомление администратору
    }
});

// Вызов несуществующего класса
$obj = new NonExistentClass();
?>
Фатальная ошибка: Class "NonExistentClass" not found в файле /var/www/test.php на строке 12

Пример 5. Диагностика include_path и подключения файлов

Ошибка «Failed to open stream» часто связана с неправильным путём. Скрипт показывает текущий путь поиска и проверяет наличие файла.

Пример
<?php
echo "Текущий include_path: " . get_include_path() . "\n\n";

$requiredFile = 'config/database.php';
if (stream_resolve_include_path($requiredFile)) {
    echo "Файл $requiredFile найден в include_path\n";
} else {
    echo "Файл $requiredFile не найден. Попробуйте:\n";
    echo "1. Указать абсолютный путь: " . __DIR__ . '/config/database.php' . "\n";
    echo "2. Добавить папку в include_path через set_include_path()\n";
}
?>
Текущий include_path: .:/usr/share/php
Файл config/database.php не найден. Попробуйте:
1. Указать абсолютный путь: /var/www/html/config/database.php
2. Добавить папку в include_path через set_include_path()

Пример 6. Получение информации о конфигурации PHP через phpinfo()

Вызов phpinfo() показывает все настройки, загруженные модули и пути.

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

После запуска найдите разделы error_reporting, display_errors, memory_limit - они подсвечены. Если какая-то директива имеет значение «no value» - это может быть причиной проблемы.

Предупреждение:

Не оставляйте phpinfo() на рабочем сайте - это раскрывает уязвимую информацию.

Пример 7. Проверка установленных расширений и их состояния

Отсутствие расширения (например, mysqli) приводит к ошибке вызова неизвестной функции.

Пример
<?php
$required_extensions = ['mysqli', 'mbstring', 'gd'];
foreach ($required_extensions as $ext) {
    if (extension_loaded($ext)) {
        echo "$ext загружено\n";
    } else {
        echo "$ext НЕ загружено\n";
    }
}
?>
mysqli загружено
mbstring НЕ загружено
gd загружено

Недостающее расширение устанавливается через пакетный менеджер (например, apt install php-mbstring) или включается в php.ini.

Страница недоступна в PHP - comments

En
страница php недоступна (php)