Простой способ вести логи средствами php. Статья рассчитана для новичков в программировании.
Бывают ситуации, когда необходимо посмотреть входящие запросы ко всем файлам CMS, либо к файлам в отдельно взятой директории. При большом числе посетителей сайта, анализ файлов access.log становится затруднительным.
Представленный ниже пример отлично справляется с этой задачей. Данный способ ведения логов рекомендуется использовать «здесь и сейчас», непосредственно на время отладки. В отличие от стандартного способа, предлагаемого любым нормальным хостинг-провайдером, в данном примере не предусмотрена очистка логов, а по сему его стоит использовать кратковременно, во избежание разрастания файлов post.log и get.log. Данный модуль позволяет записывать лог всех POST и GET запросов к php файлам в выбранной папке (включая вложенные папки).
1. Для начала создаём в корне сайта папку modules, в которой в свою очередь создаём папку log.
2. В ней создадим 2 файла. Назовём их post.log и get.log. В них мы будем записывать логи POST и GET запросов соответственно.
3. В этой же папке создадим файл save_log.php со следующим содержимым:
<?php
$file_get = $_SERVER["DOCUMENT_ROOT"] . "/modules/log/get.log";
$file_post = $_SERVER["DOCUMENT_ROOT"] . "/modules/log/post.log";
if (!empty($_GET)) {
$fw = fopen($file_get, "a");
fwrite($fw, "GET " . var_export($_GET, true));
fclose($fw);
}
if (!empty($_POST)) {
$fw = fopen($file_post, "a");
fwrite($fw, "POST " . var_export($_POST, true));
fclose($fw);
}
?>
Кратко разберем данный файл. Используя суперглобальный массив $_SERVER, определяем путь к корневой директории сервера. Затем, используя конкатенацию, получаем полный путь к файлам get.log и post.log. В итоге в переменной $file_get получаем путь вида: "/home/site/public_html/modules/log/get.log".
Затем, в зависимости от типа запроса, открываем файл post.log, либо get.log, с параметром "a". Благодаря данному параметру, при каждой последующей записи, указатель перемещается в конец файла. Таким образом, в отличие от параметра "w", при добавлении новых записей, старые не удаляются.
При помощи функции var_export, записываем информацию о POST, либо GET запросе. Не забываем закрыть файл при помощи функции fclose.
Отлично. Теперь все POST и GET запросы, приходящие на файл save_log.php, бережно сохраняются. Но как же сохранить запросы к другим файлам?
4. Для этого воспользуемся файлом .htaccess. Его необходимо создать в директории, для которой нужно вести логи. В качестве примера используем файл .htaccess, находящийся в корневой папке сайта. Допишем в начало файла следующую строчку:
php_value auto_prepend_file /home/site/public_html/modules/log/save_log.php
Где /home/site/public_html/ — путь до корневой папки сайта.
При помощи добавки php_value auto_prepend_file, мы ставим на выполнение скрипт save_log.php при запуске любого php файла, расположенного как в одной папке с файлом .htaccess, так и в любой из вложенных папок.
Как узнать полный путь до файла save_log.php? Используем для этого магическую константу __DIR__.
Создаём в нашей папке log файл, назовём его dir.php. В данном файле напишем:
<?php
echo __DIR__;
?>
Затем откроем этот файл в браузере по адресу: site.ru/modules/log/dir.php. Полученный путь вставляем в файл .htaccess
В конце на забываем удалить файл dir.php.
В результате в файле get.log сохраняется список всех GET запросов:
В файле post.log, соответственно сохраняются все POST запросы.
Автор: весёлый усач