С log_format
можно включить ряд переменных, например $ http_user_agent:
http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
Но можно ли включить переменную из PHP-FPM?
Например, я хотел бы включить идентификатор пользователя и информацию о времени в access_log
.
Одна из возможностей - установить заголовок в PHP, а затем использовать $ sent_http_XXX:
log_format inc_info '... [$sent_http_x_user_id] ...';
access_log /var/log/nginx/access.log inc_info;
<?php
header('X-User-ID: ' . head(USER_ID));
?>
Где вам, вероятно, следует использовать proxy_hide_header
чтобы остановить отправку этих заголовков клиенту.
Но этот подход на основе заголовков не работает, если заголовки уже были отправлены. Например, я использую register_shutdown_function()
в PHP для регистрации времени обработки.
Кстати, если вам просто нужно время обработки, то $ upstream_response_time может оказаться полезным.
Для сравнения, в Apache это можно сделать с помощью:
LogFormat "... [%{USER_ID}n] ..." inc_info
CustomLog /var/log/httpd/access_log inc_info
С соответствующим PHP:
if (function_exists('apache_note')) {
apache_note('USER_ID', USER_ID);
}
Хотя apache_note()
доступен только в mod_php, и не работает с PHP-FPM.
При использовании PHP-FPM вы можете отправлять только заголовки, а затем содержимое.
Итак, теперь я использую отдельный файл журнала, созданный с помощью PHP, в который можно записать в любое время - даже после отправки заголовков и содержимого.
Это особенно полезно при использовании fastcgi_finish_request()
, который позволяет вам вернуть страницу пользователю (возможно, страницу "загрузки"), поскольку ваш сценарий продолжает обрабатывать данные.
Чтобы связать журнал доступа к веб-серверу с этим новым файлом журнала, я генерирую уникальный (ish) код для каждого запроса, отправляю его в виде заголовка (для регистрации в журналах доступа к веб-серверам) и записываю его в файл журнала PHP. также.