1

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

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

例如:

request.php 的时间可以说是 12:40 AM

它将响应图像,当图像插入网页时,我收到图像请求,例如上午 12.42。

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

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

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

任何帮助!

4

2 回答 2

4

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

更新

以下代码片段假设如下:

  • 您在托管服务器上安装了一个典型的“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']或一些重新路由 - 但是你想要它。

然后,再次获取微时间,现在,从后者中减去前一个微时间,您就有了提供文件所需的时间。

因此,完成此操作后,您现在可以在数据库中记录每个请求,或者在任何地方记录每个请求,并相应地指定字段名称。

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

于 2014-11-13T02:54:12.380 回答
1

2:根据您的问题,我认为要求是实际获得图像最终“显示”在访问者浏览器上的时间?

如果是这种情况,那么这可能会很快获得技术,这取决于信息应该有多准确,并且如果您不介意通过 XMLHTTpRequest 获取所述图像 - 通过 JavaScript。如果是这种情况,您可以将整个服务器端的事情作为先决条件,此外,设置自定义响应标头,即:

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

然后 readfile('blah.jpg');

在客户端,使用 XMLHTTpRequest,在onload事件中设置另一个对服务器的请求,图像 ID 为 egxhr.getResponseHeader('x-imageID')和当前时间(以毫秒为单位) new Date().getTime():。

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

希望能帮助到你 ;)

于 2014-11-13T03:53:33.893 回答