【问题标题】:file download time log文件下载时间日志
【发布时间】:2009-10-29 11:30:35
【问题描述】:

有没有办法记录(记录)通过浏览器从网络服务器下载文件所花费的时间?文件写在硬盘上,环境是LAMP。

谢谢。

【问题讨论】:

    标签: php apache http


    【解决方案1】:

    当然有。您将不得不使用 mod_rewrite 让 Apache 知道该文件将由 PHP 提供(如果是这种情况,请询问更多说明),或者只使用 PHP 脚本来获取文件,如下所示:

    http://youserver.com/download.php?filename=mypicture.jpeg

    然后你可以像这样拥有download.php

    <?php
    // gets the starting time
    $time_start = microtime(true);
    
    // WATCHOUT! THIS IS NOT SECURE! EXAMPLE ONLY.
    #$filename = $_GET['filename'];
    
    // gets the intro.mp3 file and outputs it to the user
    $filename = "intro.mp3";
    header('Content-type: audio/mpeg');
    header('Content-Length: '.filesize($filename));
    header('Content-Disposition: attachment; filename="intro.mp3"');
    readfile($filename);
    
    // gets the end time and duration
    $time_end = microtime(true);
    
    // write time to hdd, database, whatever
    // ...
    error_log("Processing time: ". sprintf("%.4f", ($time_end-$time_start))." seconds");
    ?>
    

    请记住,$filename = $_GET['filename'] 仅作为示例,应正确转义,以免人们侵入您的服务器。

    编辑:
    更改以检查它是否真的有效 - 马克让我质疑它! ;) 需要进行微调(尤其是在微时间上),但是的,它确实有效

    【讨论】:

    • 这真的有效吗?我认为这只是时间,直到它到达那个点脚本......为什么要等待文件完成发送?
    • 我只需要做一些调整,上面的代码是概念证明,但是是的,它确实记录了使用的时间。 PHP 是同步的,因此必须等待 readfile() 完成。
    • PHP 可能是同步的,因为它一直等到 readfile() 完成,但这并不能告诉您有关堆栈其余部分的任何信息。 Apache 很可能(并且很可能确实)将完整的文件接受到服务器的 RAM 内存中,然后慢慢将其发送出去,直到 readfile() 和您的脚本终止很久之后...
    • @Wim 试试吧...我真的不知道它在作为 CGI 运行的 PHP 上的表现如何。 PHP 作为 Apache 模块运行时,Apache 和 PHP 是相同的,这意味着 PHP 将保持对 Apache 的计时,直到它结束。我的结果是 32 秒。在我的手表上,我计时了 32 秒。它有效。
    • 嗯,它确实有效。或者到目前为止似乎如此。我会做更多的测试并回复你,但还是谢谢你。
    【解决方案2】:

    一种方法是通过脚本代理下载(可以通过 mod_rewrite 轻松实现)。这意味着您需要完成所有工作,例如将扩展映射到其相应的 mime 类型(对于 Content-Type 标头)。尝试从浏览器下载文件,并查看它发送的标头;你需要模仿那些。您可以使用例如。 web-sniffer.net 来检查标题。

    【讨论】:

    • 致问题的作者——现在可能是擅离职守——这个答案也很好,因为如果你打算在多个文件类型上执行此操作,你必须检查它们的 mime 类型并相应地进行调整。跨度>
    【解决方案3】:

    我认为 PHP 无法访问此类信息。我不确定 Apache 是否会告诉你,或者下面的方法是否也会计时,直到文件被转储到传输缓冲区,但我建议你试试这个:

    定义一个自定义日志,其中包含“%D”指令,这将为您提供“服务请求所用的时间,以微秒为单位。”

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多