Логирование POST и GET запросов на сайте
Иногда возникает необходимость отследить GET или POST запросы на своем сайте. Сделать это средствами PHP довольно просто даже новичку. Как – рассказано в этом материале.
Для удобства в корне сайта создадим отдельную папку — например log.
В этой папке log создаем два файла – например, post.log и get.log. В них будут записываться все запросы – POST и GET соответственно. Файлы оставляем пустыми.
В той же папке log создаем файл path.php, в него записываем код:
И снова в папке log создадим еще один файл – logger.php. Внутри него поместим следующий код:
Этот скрипт и будет записывать в наши файлы post.log и get.log нужные нам логи. Далее начинается магия. Предположим, ваш сайт называется MySite.ru. Запускаем любимый браузер и открываем адрес:
/home/mysite.ru/public_html/log/path.php
/home/mysite.ru/public_html/log/logger.php
php_value auto_prepend_file
php_value auto_prepend_file /home/mysite.ru/public_html/log/logger.php
Идем дальше. Теперь нам надо сделать так, чтобы при поступлении POST или GET отрабатывал наш скрипт из файла logger.php. Делается это следующим образом – в корневом директории вашего сайта с вероятностью 99% есть файл .htaccess. Если вы из того 1%, у кого в корне сайта такого файла нет – просто создайте его. Далее открываете файл .htaccess на редактирование и дописываете в него строку нашу строку:
php_value auto_prepend_file /home/mysite.ru/public_html/log/logger.php
- После того, как вы все сделали, файл path.php лучше удалить.
- Логи в файлах post.log и get.log сами не самоочищаются, поэтому размеры этих файлов будут постоянно расти до тех пор, пока вы не отключите логирование.
Еще записи по теме
Логирование всех POST и GET запросов
Простой способ вести логи средствами 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 со следующим содержимым:
Кратко разберем данный файл. Используя суперглобальный массив $_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. В данном файле напишем:
Затем откроем этот файл в браузере по адресу: site.ru/modules/log/dir.php. Полученный путь вставляем в файл .htaccess
В конце на забываем удалить файл dir.php.
В результате в файле get.log сохраняется список всех GET запросов:
В файле post.log, соответственно сохраняются все POST запросы.
magnetikonline / dumprequest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
// https://gist.github.com/magnetikonline/650e30e485c0f91f2f40 |
class DumpHTTPRequestToFile |
public function execute ( $ targetFile ) |
$ data = sprintf( |
» %s %s %s \n\n HTTP headers: \n», |
$ _SERVER [ ‘REQUEST_METHOD’ ], |
$ _SERVER [ ‘REQUEST_URI’ ], |
$ _SERVER [ ‘SERVER_PROTOCOL’ ] |
); |
foreach ( $ this -> getHeaderList () as $ name => $ value ) |
$ data .= $ name . ‘: ‘ . $ value . «\n»; |
> |
$ data .= «\n Request body: \n»; |
file_put_contents( |
$ targetFile , |
$ data . file_get_contents( ‘php://input’ ) . «\n» |
); |
echo (» Done! \n\n»); |
> |
private function getHeaderList () |
$ headerList = []; |
foreach ( $ _SERVER as $ name => $ value ) |
if (preg_match( ‘/^HTTP_/’ , $ name )) |
// convert HTTP_HEADER_NAME to Header-Name |
$ name = strtr(substr( $ name , 5 ), ‘_’ , ‘ ‘ ); |
$ name = ucwords(strtolower( $ name )); |
$ name = strtr( $ name , ‘ ‘ , ‘-‘ ); |
// add to list |
$ headerList [ $ name ] = $ value ; |
> |
> |
return $ headerList ; |
> |
> |
( new DumpHTTPRequestToFile )-> execute ( ‘./dumprequest.txt’ ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
GET /dumprequest.php HTTP/1.1 |
HTTP headers: |
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8 |
Accept-Encoding: gzip, deflate, br |
Referer: http://localhost/ |
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 |
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36 |
Upgrade-Insecure-Requests: 1 |
Connection: keep-alive |
Host: localhost |
Request body: |
Hey ! Thanks for this helpfull script !
My suggestions :
- remove ‘echo(«Done!\n\n»);’ : user of this script should be able to have control of what is written to the request output
- change $data .= «\nResponse body:\n»; to $data .= «\nRequest body:\n»; ? Since what you dump is the body of the actual request, not the response
@beebopfr Request body of course 👍 Thanks!
It’s a very useful script would be useful if it can dump
$_GET
data as well and also list
$_SERVER[‘REMOTE_ADDR’]
hi ,
am how to use this script to get the response .
To add every new register instead of replacing the previous one, you must use FILE_APPEND with file_get_content.
$data . file_get_contents(‘php://input’) . «\n*************************************************************\n», FILE_APPEND
Thank you.
Use this line to get GET/POST data
add this line at the end to create a file for each request with timestamp
$date = new DateTime();
rename(«dumprequest.txt», «dumprequest» . $date->format(‘Y-m-d H:i:sP’) . «.txt»);
This doesn’t need to be a class, could be a easy to use library function.
Hey! thanks for this script.
I’m a complete newbie and maybe I can not even explain myself. However what I need is to save data coming from an http request to my server on a file. Thus it seems that the above script is perfect for my needs.
What I do not understand is where to put the script and how let it works: should I put the script on my server and use is URL in the http request to let him works and create the file?
For the next time I come across this- Single function version.
@jotham thanks for summarizing it
Simple, but useful snippet. 🙂
Yeah I also find that FILE_APPEND would be great so you can tail -f the log file and it does not get overwritten all the time. Apart from that, useful PHP snippet ;). THX
My edit to dump request to server log via php -S localhost:62000 .
$time = time(); error_log("--------------------[START/" . $time . "]--------------------"); error_log(""); error_log(sprintf("%s %s %s", $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_SERVER['SERVER_PROTOCOL'])); error_log(""); error_log(""); foreach ($_SERVER as $headerName => $headerValue) < if (preg_match('/^HTTP_/', $headerName)) < // convert HTTP_HEADER_NAME to Header-Name $headerName = strtr(substr($headerName, 5), '_', ' '); $headerName = ucwords(strtolower($headerName)); $headerName = strtr($headerName, ' ', '-'); error_log("$headerName: $headerValue"); > > error_log(""); $body = file_get_contents('php://input'); $bodyLength = strlen($body); error_log(""); error_log($bodyLength ? $body : "(empty body)"); error_log(""); error_log("---------------------[END/" . $time . "]---------------------");
[Wed Dec 15 13:45:00 2021] 127.0.0.1:40922 Accepted [Wed Dec 15 13:45:00 2021] --------------------[START/1639568700]-------------------- [Wed Dec 15 13:45:00 2021] [Wed Dec 15 13:45:00 2021] POST / HTTP/1.0 [Wed Dec 15 13:45:00 2021] [Wed Dec 15 13:45:00 2021] [Wed Dec 15 13:45:00 2021] X-Real-Ip: 127.0.0.1 [Wed Dec 15 13:45:00 2021] X-Forwarded-For: 127.0.0.1 [Wed Dec 15 13:45:00 2021] Host: 127.0.0.1 [Wed Dec 15 13:45:00 2021] Connection: close [Wed Dec 15 13:45:00 2021] Content-Length: 11 [Wed Dec 15 13:45:00 2021] User-Agent: HTTPie/1.0.3 [Wed Dec 15 13:45:00 2021] Accept-Encoding: gzip, deflate [Wed Dec 15 13:45:00 2021] Accept: */* [Wed Dec 15 13:45:00 2021] Content-Type: application/x-www-form-urlencoded; charset=utf-8 [Wed Dec 15 13:45:00 2021] [Wed Dec 15 13:45:00 2021] [Wed Dec 15 13:45:00 2021] hello=world [Wed Dec 15 13:45:00 2021] [Wed Dec 15 13:45:00 2021] ---------------------[END/1639568700]--------------------- [Wed Dec 15 13:45:00 2021] 127.0.0.1:40922 [200]: POST / [Wed Dec 15 13:45:00 2021] 127.0.0.1:40922 Closing
PHP. Отследить REQUEST запрос с помощью логирования в файл
Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Отслеживаем входящие GET и POST параметры с помощью логирования.
Данный рецепт может потребоваться, тогда когда у вас есть некое апи(сокр. api — application programming interface — программный интерфейс приложения, интерфейс прикладного программирования), которое должно принимать входящие данные со сторонних сервисов различными типами запросов.
Если вам потребовалось отследить входящие параметры, то можно воспользоваться логированием данных входящих запросов.
Если вы не совсем уверены какого типа у вас запрос(GET или POST), то можно воспользоваться глобальной переменной $_REQUEST.
Данная глобальная переменная представляет из себя ассоциативный массив, который содержит в себе GET, POST и COOKIE данные.
Но в остальных случаях желательно использовать реально требуемые типы запросов.
С помощью данной конструкции вы можете выполнять логирование в файл:
ob_start(); var_dump($_REQUEST); $output = ob_get_clean(); file_put_contents('log.txt', $output, FILE_APPEND);
- 1 строка. Функция ob_start — включает буферизацию вывода. До тех пор, пока буферизация активна, никакой вывод скрипта (кроме заголовков) не будет сохраняться во внутреннем буфере.
- 2 строка. С помощью функции var_dump выводим информацию о глобальной переменной $_REQUEST.
- 3 строка. Получаем содержимое текущего буфера с помощью функции ob_get_clean, записываем в переменную $output, после чего функция ob_get_clean чистит содержимое текущего буфера.
- 4 строка. Пишем данные в файл с помощью функции file_put_contents, где первым параметром указываем местоположение файла с логами, вторым параметром передаем данные, которые будут должны записаться в файл с логами (В нашем случае это параметры входящего запроса, которые были приняты из текущего буфера) и третий параметр содержит константу FILE_APPEND (данная константа позволяет функции file_put_contents дописывать данные в файл с логами, не перезаписывая ранее полученные данные).
В данной статье мы разобрали, то каким образом можно отловить и записать входящие данные GET(гет), POST(пост) или COOKIE(куки) типов запросов в файл.