3

With the log_format its possible to include a range of variables such as $http_user_agent:

http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

But is it possible to include a variable from PHP-FPM?

For example, I would like to include the User ID and timing information in the access_log.

One possibility is to set a header in PHP, and then use $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));
?>

Where you should probably use proxy_hide_header to stop those headers being sent to the client.

But this header based approach doesn't work if the headers have already been sent. For example, I use register_shutdown_function() in PHP to log the processing time.


As an aside, if you did just want the processing time, then $upstream_response_time might be useful.


In comparison, this can be done in Apache via:

LogFormat "... [%{USER_ID}n] ..." inc_info
CustomLog /var/log/httpd/access_log inc_info

With the corresponding PHP:

if (function_exists('apache_note')) {
    apache_note('USER_ID', USER_ID);
}

Although apache_note() is only available in mod_php, and it does not work with PHP-FPM.

1 Answer 1

0

When using PHP-FPM, you can only send headers, then the content.

So I'm now using a separate log file, one created from PHP, and can be written to at any time - even after the headers and content has been sent.

This is especially useful when using fastcgi_finish_request(), which allows you to return a page to the user (maybe a "loading" page), as your script continues to process data.

To link the web server access log with this new log file, I generate a unique(ish) code for each request, send that as a header (to be logged in the Web Servers access logs), and record it in the PHP log file as well.

More info on the Apache version.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .