Причины и способы исправления ошибки недоступности 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.