Почему не работает PHP сценарий: подробный разбор проблем выполнения

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

Диагностика неработающего PHP файла

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

Включение отображения ошибок (базовый метод)

Добавьте в начало проблемного файла следующие строки:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// остальной код ...
?>

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

Этот код заставляет интерпретатор выводить все типы ошибок на экран. Если после этого появилось сообщение, вы сможете определить проблему.

Типичные сложности:

  • Настройки php.ini могут запрещать изменение директив через ini_set (значение display_errors может быть заблокировано директивой ini_set() в безопасном режиме). В таком случае нужно редактировать php.ini.
  • После включения показа ошибок может появиться много сообщений. Часть из них - просто уведомления, не влияющие на работу. Стоит обращать внимание на Fatal error и Parse error.
  • На боевом сервере не рекомендуется оставлять display_errors включённым из соображений безопасности.

Варианты решений

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

Используйте консольную команду php -l. Она проверяет синтаксис, не запуская скрипт.

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

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

В результате вы увидите либо No syntax errors detected, либо сообщение об ошибке с номером строки.

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

Команда может быть недоступна, если PHP не установлен в командной строке. Для проверки используйте php -v. Если нужно, укажите полный путь к исполняемому файлу PHP.

Что делать, если страница полностью пустая (белый экран)?

Белый экран - признак фатальной ошибки. Включите показ ошибок через error_reporting(E_ALL) и ini_set('display_errors', 1). Если это не помогло, проверьте логи веб-сервера (например, error.log Apache). На многих хостингах логи доступны в панели управления.

// Логирование ошибок в файл:
ini_set('log_errors', 1);
ini_set('error_log', '/путь/к/php_errors.log');

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

После этого все ошибки будут писаться в указанный лог-файл. Просмотрите его содержимое.

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

Увеличьте лимит памяти. Это можно сделать через php.ini или прямо в скрипте:

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

Либо через .htaccess (если разрешено):

php_value memory_limit 256M

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

Попытка увеличить лимит после того, как скрипт уже начал выполняться, может не сработать. Рекомендуется устанавливать лимит в самом начале скрипта. Если ошибка возникает при обработке больших данных, стоит оптимизировать код (например, использовать потоковую обработку вместо загрузки всего объёма в память).

Как справиться с ошибками подключения файлов (require/include)?

Проверьте правильность пути. Используйте константу __DIR__ для абсолютного пути относительно текущего файла.

require_once __DIR__ . '/../includes/config.php';

Добавьте проверку существования файла перед подключением:

if (file_exists($path)) {
    require $path;
} else {
    die('Файл не найден: ' . $path);
}

Частая причина:

Использование относительных путей, которые зависят от текущего рабочего каталога. Рекомендуется всегда указывать абсолютные пути с помощью __DIR__ или задавать базовую директорию через define('BASE_DIR', dirname(__FILE__)).

Что делать, если скрипт работает на локальном сервере, но не на хостинге?

Сравните версию PHP, настройки php.ini, доступные расширения. Создайте скрипт проверки:

<?php
phpinfo();
?>

Загрузите его на хостинг и посмотрите, какие директивы отличаются. Обратите внимание на short_open_tag (если используете короткие <?), register_globals (устаревшее), display_errors, error_reporting.

Также проверьте права на файлы: обычно требуется 644 для файлов и 755 для папок.

Скрытые проблемы:

Разница в кодировке файлов (BOM метка) может вызывать ошибку «Cannot modify header information». Следует сохранять файлы без BOM.

Как использовать пользовательскую обработку ошибок?

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

function myErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "<b>Ошибка:</b> [$errno] $errstr в файле $errfile на строке $errline\n";
    return true;
}
set_error_handler('myErrorHandler');

register_shutdown_function(function() {
    $error = error_get_last();
    if ($error !== null) {
        echo "Фатальная ошибка: {$error['message']} в {$error['file']} на строке {$error['line']}";
    }
});

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

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

1. Полная диагностика через set_error_handler и shutdown

Пример
<?php
// Включаем строгий отчёт обо всех ошибках
error_reporting(E_ALL);
ini_set('display_errors', 0); // отключаем вывод на экран
i$logFile = __DIR__ . '/debug.log';

// Пользовательский обработчик ошибок
function customError($level, $message, $file, $line) {
    global $logFile;
    $log = date('Y-m-d H:i:s') . " [$level] $message в $file:$line\n";
    file_put_contents($logFile, $log, FILE_APPEND);
    return true; // запрещаем стандартный обработчик
}
set_error_handler('customError');

// Обработка фатальных ошибок
register_shutdown_function(function() {
    global $logFile;
    $error = error_get_last();
    if ($error !== null && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        $log = date('Y-m-d H:i:s') . " [FATAL] {$error['message']} в {$error['file']}:{$error['line']}\n";
        file_put_contents($logFile, $log, FILE_APPEND);
        echo 'Произошла критическая ошибка. Подробности в логе.';
    }
});

// Пример кода с ошибкой
echo $undefinedVar; // Notice: undefined variable
require 'nonexistent.php'; // Warning: failed to open stream
?>

Результат: в файл debug.log запишутся сообщения обо всех ошибках, включая фатальную (если файл не найден - может быть Warning, если require не сможет подключить - Fatal error, если файл отсутствует и отключено отображение).

2025-03-28 12:00:01 [8] Undefined variable: undefinedVar в /var/www/test.php:18
2025-03-28 12:00:01 [2] require(nonexistent.php): Failed to open stream: No such file or directory в /var/www/test.php:19
2025-03-28 12:00:01 [FATAL] require(): Failed opening required 'nonexistent.php' в /var/www/test.php:19

2. Проверка версии PHP и расширений

Пример
<?php
echo 'Версия PHP: ' . phpversion() . "\n\n";
$requiredExtensions = ['mbstring', 'mysqli', 'gd', 'json'];
foreach ($requiredExtensions as $ext) {
    if (extension_loaded($ext)) {
        echo "Расширение $ext: загружено (версия " . phpversion($ext) . ")\n";
    } else {
        echo "Расширение $ext: НЕ загружено\n";
    }
}
?>

Результат (пример):

Версия PHP: 8.2.12

Расширение mbstring: загружено (версия 8.2.12)
Расширение mysqli: загружено (версия 8.2.12)
Расширение gd: загружено (версия 8.2.12)
Расширение json: загружено (версия 8.2.12)

3. Использование Xdebug для трассировки

Установите Xdebug и включите в php.ini:

Пример
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.log=/tmp/xdebug.log

После этого выполните скрипт с GET-параметром XDEBUG_SESSION=1 (например, http://example.com/script.php?XDEBUG_SESSION=1). IDE (PhpStorm, VS Code) сможет ловить точки останова. В логе Xdebug будет детальная информация о вызовах функций.

4. Обработка исключений с try/catch

Пример
<?php
try {
    // Код, который может выбросить исключение
    if (!file_exists('data.txt')) {
        throw new Exception('Файл data.txt не найден.');
    }
    $content = file_get_contents('data.txt');
    if ($content === false) {
        throw new RuntimeException('Не удалось прочитать файл.');
    }
    $json = json_decode($content);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new InvalidArgumentException('Ошибка формата JSON: ' . json_last_error_msg());
    }
    echo 'Данные успешно загружены.';
} catch (Exception $e) {
    echo 'Поймано исключение: ' . $e->getMessage() . ' в файле ' . $e->getFile() . ' на строке ' . $e->getLine();
    // Также можно записать в лог
    error_log($e->__toString());
}
?>

Результат при отсутствии файла:

Поймано исключение: Файл data.txt не найден. в файле /var/www/test.php на строке 6

5. Изменение настроек через .htaccess (Apache) или .user.ini

В корневой папке сайта создайте .htaccess (если Apache):

Пример
php_flag display_errors on
php_value error_reporting 22527   # E_ALL & ~E_DEPRECATED & ~E_STRICT
php_value memory_limit 128M
php_value upload_max_filesize 64M

Для Nginx или другого сервера используйте .user.ini:

Пример
display_errors = On
error_reporting = E_ALL
memory_limit = 256M

Эти файлы действуют только на текущую директорию и поддиректории. Важно проверить, разрешена ли переопределение директив (AllowOverride для Apache). Если нет - изменения не применятся.

6. Проверка синтаксиса всех файлов в проекте

Пример
find /путь/к/проекту -name '*.php' -exec php -l {} \; 2>&1 | grep -v 'No syntax errors'

Эта команда рекурсивно проверит синтаксис всех PHP файлов и выведет только строки с ошибками.

Результат при наличии ошибки:

PHP Parse error:  syntax error, unexpected 'echo' (T_ECHO) in /var/www/test.php on line 10

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

En
не работает php файл (php)