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: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 ;)
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.
The following code snippets assume the following:
.htaccess
files)mod_rewrite
installed and enableddocroot
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.