检查每个请求到达apache web服务器

时间:2014-11-13 02:32:05

标签: php apache .htaccess get access-log

我有一个奇怪的要求,要检查每个请求和响应之间的时差

我有一个PHP文件(request.php)服务于图像作为它的响应,所以我必须检查GET request.php和GET图像请求之间的时差。对于每一个请求。

例如:

时间request.php让我们说12:40 AM

它将响应图像,当图像插入网页时,我得到图像请求说12.42 AM。

所以我的要求是每次点击我的服务器时计算request.php和image之间的时差。

我建议阅读Apache访问日志,但是客户希望我记下每个请求的请求时间,并将一些请求存储在哪里,并计算每天请求之间的平均值。

我的想法是阅读Apache-log并且有一种方法可以编写一个php脚本,它可以用于每个传入的请求并检查它的时间,可能是一个自定义的访问日志文件。

任何帮助!!

2 个答案:

答案 0 :(得分:4)

您应该使用处理程序来挂钩每个请求。 这可以很容易地完成,但是你也应该从你的php中提供文件。

更新

以下代码段假设如下:

  • 您在托管服务器上安装了典型的“LAMP堆栈”
  • 您的Apache配置“允许目录覆盖”(包含.htaccess个文件)
  • 您的Apache设置已安装并启用mod_rewrite
  • Apache + PHP具有对您docroot
  • 中创建的所有文件的读取权限
  • 您的PHP版本至少为5.5(或更高)

在服务器的docroot文件夹中,创建以下文件:

  • .htaccess
  • handler.php

<强>的.htaccess
在您喜欢的文本编辑器中打开.htaccess文件,输入以下内容,然后保存:

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


<强> handler.php
.handler.php文件中键入以下内容,然后保存:

<?

    $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;

?>


对于每个请求,请获取当前microtime

然后,提供文件,(获取文件的mime类型,编写适当的标题:“Content-type”,简单地说:readfile('path/to/file.mp3');

*其中'path / to / file.mp3'显然是: $_SERVER['REQUEST_URI']或某些重新路由 - 但是你想要它。

然后,再次获取microtime,现在,从后者中减去前一个microtime,并且您有足够的时间来提供该文件。

因此,完成后,现在您可以在数据库中记录每个请求,或者在每个请求中记录相应的字段名称。

我不确定需要多少细节,请相应评论。

答案 1 :(得分:1)

2:从你的问题来看,我认为要求是实际获得图像最终显示的时间&#34;在访问者的浏览器上?

如果是这种情况,那么,这可能会非常快速,取决于信息的准确程度,以及如果您不介意通过XMLHTTpRequest获取所述图像。如果是这种情况,你可以将整个服务器端的东西作为先决条件,通过设置自定义响应头,即:

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

然后是readfile(&#39; blah.jpg&#39;);

在客户端,使用XMLHTTpRequest,在onload事件中为服务器设置另一个请求,其中image-id为xhr.getResponseHeader('x-imageID'),当前时间为毫秒:{{1 }}

显然,您需要设置一些信息来区分请求,以便服务器只记录图像请求,并使用&#34;更新时间&#34;更新记录。请求。

希望它有所帮助;)