check every request coming to apacheweb server

1.5k views Asked by At

I have a weird requirement asked , to check time difference between each request and response

I have a PHP file (request.php) serving a image as it's response, so i have to check time difference between GET request.php and GET image request. for each and every request.

For example:

the time request.php is made lets say 12:40 AM

it will response a image, when image is inserted in a web page i get a image request say 12.42 AM.

so my requirement is to calculate time difference between request.php and image every time they hit my server.

I suggested to read Apache access-log but client want me to note request time for every request made and store some where and calculate average between each request on end of the day.

My idea is to read Apache-log and is there a way we can write a php script which will work for every incoming request and check it's timing, probably a custom access-log file.

Any Help!!

2

There are 2 answers

0
AudioBubble On BEST ANSWER

2:From your question, I gather that the requirement is to actually get the time that the image finally "shows up" on the visitor's browser?

If that is the case, then, well this may get technical pretty quick, depending how accurate the info should be, and also if you don't mind getting the said images via XMLHTTpRequest - via JavaScript. If that is the case, you can do the whole server-side thing as a pre-requisite, aditionally, set a custom response header, i.e:

header('x-imageID', $mysql_insert_id());

Then readfile('blah.jpg');

on the client-side, with the XMLHTTpRequest, set in the onload event another request to the server, with the image-id with e.g xhr.getResponseHeader('x-imageID') and the current time in milliseconds: new Date().getTime().

obviously you will need to set some info to distinguish the requests so that the server will only log for image requests, and update the records with the "update time" requests.

Hope it helps ;)

1
AudioBubble On

You should use a handler to be able to hook into each and every request. This can be done quite easily, but you should then also serve the files from your php.

Update

The following code snippets assume the following:

  • you have a typical "LAMP stack" installed on the hosting server
  • your Apache config "allows directory overrides" (with .htaccess files)
  • your Apache setup has mod_rewrite installed and enabled
  • Apache+PHP has read permission of all the files created in your docroot
  • your PHP version is at least 5.5 (or better)

In your server's docroot folder, create these files:

  • .htaccess
  • handler.php

.htaccess
Open the .htaccess file in your favorite text editor, type in the following, and save:

RewriteEngine On
RewriteCond %{REQUEST_URI} !handler.php$
RewriteRule (.*) handler.php


handler.php
Type the following in your .handler.php file, and save:

<?

    $over = $_SERVER['SERVER_PROTOCOL'];
    $path = explode('?',$_SERVER['REQUEST_URI']);
    $path = (($path == '/') ? '/home.html');
    $extn = array_shift((explode('.',$path)));
    $list = # array
    [
        'html' => 'text/html',
        'css'  => 'text/css',
        'png'  => 'image/png',
        'js'   => 'application/javascript',
    ];

    $type = (isset($mime[$extn]) ? $mime[$extn] : 'text/plain');

    if (file_exists(".${path}"))
    {
        if (is_dir(".${path}") || ($path == '/.htaccess'))
        {
            header("${over} 403 Forbidden");
            echo "path: `$path` is forbidden";
            exit;
        }

        header("${over} 200 OK");
        header("Content-Type: ${type}");
        header("Content-Length: ".filesize($path));

        readfile($path);
        exit;
    }

    header("${over} 404 Not Found");
    echo "path: `$path` is undefined";
    exit;

?>


With each request, get the current microtime.

then, serve the file, (get the mime type of the file, write appropriate header: "Content-type", and simply: readfile('path/to/file.mp3');

*where 'path/to/file.mp3' would obviously be: $_SERVER['REQUEST_URI'] or some re-routing - however you want it.

then, get the microtime again, now, subtract the former microtime from the latter, and you have the time it took to serve the file.

So, with that done, now you can log each request in the database, or where-ever, per request, specifying the field names accordingly.

I'm not sure how how much detail is required, please comment accordingly.