Avatar ·

Где PHP хранит лог ошибок? (PHP 5, Apache, FastCGI, cPanel)

Всем привет! Я начинающий PHP-разработчик, работаю на общем хостинге с cPanel. Сервер использует Apache в режиме FastCGI. У меня есть простой скрипт, который иногда выдает ошибку, но я не вижу её на экране — просто белая страница. Вот пример кода, который у меня сейчас: ```php ``` Я специально сделал опечатку в имени таблицы (допустим, `userss`), чтобы проверить, как логируется ошибка. Включил `display_errors` в php.ini, но ничего не изменилось — страница всё равно белая. Пробовал искать файл `error_log` в корне сайта, в папке `/tmp`, но не нашел. Мой хостинг — обычный shared-хостинг с cPanel. Где именно PHP (версия 5.6) сохраняет логи ошибок в такой конфигурации? Может быть, есть какой-то стандартный путь, который я пропустил? Или, возможно, нужно настраивать что-то дополнительно в `.htaccess` или `php.ini`? Буду благодарен за подробный ответ, потому что белая страница смерти меня уже достала. <<>>

Где искать лог ошибок PHP в типичной конфигурации Apache + FastCGI + cPanel

Привет! Твоя проблема очень распространена среди начинающих. В конфигурации Apache + FastCGI + cPanel логи ошибок PHP могут храниться в нескольких местах, и важно знать, куда смотреть в первую очередь.

Вот основной список возможных местоположений лог-файлов:

  • Лог ошибок PHP (глобальный): Обычно находится в /var/log/php_error_log или /var/log/php5/error.log. На многих хостингах cPanel этот файл недоступен для чтения пользователю.
  • Лог ошибок Apache: /var/log/apache2/error.log или /usr/local/apache/logs/error_log. В cPanel часто есть отдельный лог для каждого домена: /home/username/logs/domain.com.error.log.
  • Лог ошибок PHP для конкретного пользователя: В cPanel можно найти файл error_log прямо в корневой директории твоего сайта (например, /home/username/public_html/error_log).
  • Лог в директории скрипта: Если в твоем скрипте или в .htaccess указан конкретный путь для лога, он будет там.

Как найти лог через cPanel

Самый простой способ — войти в панель cPanel и найти раздел "Error Log" или "Apache Error Log". Там отображаются последние ошибки. Также можно зайти в "File Manager" и проверить корень сайта на наличие файла error_log.

Настройка логирования через .htaccess

Если ты хочешь гарантированно видеть ошибки в своем файле, добавь в .htaccess в корне сайта следующие строки:

# Включаем логирование ошибок PHP
php_flag log_errors on
php_value error_log /home/username/public_html/my_php_errors.log

# Показывать ошибки на экране (только для разработки!)
php_flag display_errors on
php_value error_reporting E_ALL

Проверка через сам PHP

Ты можешь создать временный скрипт, который покажет текущие настройки:

<?php
// Создай файл phpinfo.php в корне сайта
phpinfo();
?>

Открой его в браузере. Найди секцию "error_log" — там будет указан путь к файлу, куда PHP сейчас пишет ошибки. Также обрати внимание на директиву "error_log" в разделе "Core".

Решение для твоего конкретного случая

Скорее всего, на твоем хостинге cPanel настроено так, что лог ошибок PHP пишется в файл /home/username/logs/domain.com.error.log. Проверь эту директорию через File Manager. Также обязательно проверь корень сайта — файл error_log может быть скрыт (в cPanel включи опцию "Show Hidden Files").

Если ты не можешь найти лог, добавь в начало своего скрипта следующий код для принудительного логирования:

<?php
// Временное решение для отладки
ini_set('log_errors', 1);
ini_set('error_log', dirname(__FILE__) . '/my_debug.log');
error_reporting(E_ALL);

// Твой код
include 'config.php';
$result = mysqli_query($link, "SELECT * FROM userss");
if (!$result) {
    error_log("MySQL Error: " . mysqli_error($link));
}
?>

После этого в той же папке, где лежит скрипт, появится файл my_debug.log с подробной информацией об ошибке.

И последнее: на боевом сервере никогда не оставляй display_errors = On — это угроза безопасности. Используй только логирование.

<<>>

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

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

Вот простой класс-логгер, который можно подключить в начало любого скрипта:

<?php
class SimpleLogger {
    private $logFile;
    
    public function __construct($filename = 'app_errors.log') {
        $this->logFile = dirname(__FILE__) . '/' . $filename;
    }
    
    public function log($message, $level = 'ERROR') {
        $date = date('Y-m-d H:i:s');
        $logEntry = "[$date] [$level] $message" . PHP_EOL;
        file_put_contents($this->logFile, $logEntry, FILE_APPEND | LOCK_EX);
    }
}

// Использование
$logger = new SimpleLogger();
$logger->log("Попытка соединения с БД");

$result = mysqli_query($link, "SELECT * FROM userss");
if (!$result) {
    $logger->log("Ошибка MySQL: " . mysqli_error($link));
    echo "Произошла ошибка. Подробности в логе.";
}
?>

Этот подход гарантирует, что ты всегда будешь видеть ошибки, независимо от настроек сервера. Файл лога будет создан в той же папке, что и скрипт. Не забудь добавить файл app_errors.log в .gitignore и настроить права доступа (обычно 644 или 600).

Также рекомендую использовать готовые библиотеки логирования, такие как Monolog, если проект становится больше. Они умеют писать в файлы, базы данных, отправлять на email и даже в Slack.

Главное преимущество этого метода — полная независимость от конфигурации сервера и cPanel. Ты сам решаешь, куда и в каком формате сохранять ошибки.