【问题标题】:Detect how long it takes for a file to upload (PHP)检测文件上传需要多长时间(PHP)
【发布时间】:2011-02-25 07:03:19
【问题描述】:

是否有可能知道(服务器端)文件上传所用的时间?我有一个图片上传 API,在我的回复中我想返回上传时间(不包括脚本执行时间)。

【问题讨论】:

  • 向我们展示您用于上传文件的代码
  • 通过将文件作为 multipart/form-data 发布到我的 api url 来上传文件

标签: php upload


【解决方案1】:

在 Apache 2.2.22 和 PHP 5.2.17 中,我使用 apache_response_headers() 引导和 flush() 命令,另一种方式它不起作用,我收到带有一个变量的标题。 ob_end_flush() 没有帮助我。 $_SSERVER 的 REQUEST_TIME 变量是优雅的等价物,但请注意这适用于 PHP 5.1。

【讨论】:

    【解决方案2】:

    查看链接。

    http://prefetch.net/blog/index.php/2007/01/02/measuring-apache-request-processing-time/

    它展示了如何配置 apache 来记录 apache 收到请求的时间。

    然后你可以在 PHP 中使用 apache_request_headers 基金并提取那个时间。

    http://php.net/manual/en/function.apache-request-headers.php

    或许通过这种方式,您可以计算出 apache 开始接收文件和将处理传递给 php 之间的时间?

    可能需要做一些测试,因为我还没有尝试过。让我知道它是否有效... :)

    更新由@GustavBertram:

    注意:我编辑了答案而不是我自己的问题,因为我想分别记录每个答案的尝试。

    我在 Apache 中启用了 mod_headers,并添加了以下配置文件:

    #/etc/apache2/mods-available/headers.conf
    RequestHeader set X-Request-Received: %t
    

    然后我更新了我的脚本:

    <form action="#" enctype="multipart/form-data" method="post">
    Upload:<input type="file" name="datafile" size="40">
    <input type="submit" value="Send">
    </form>
    <?php
    
    // Get the request headers
    $REQUEST_HEADERS = apache_request_headers();
    
    // Extract $t value from header
    parse_str($REQUEST_HEADERS['X-Request-Received']);
    
    // Massage string to get float in seconds
    $received_time = substr_replace($t, '.', 10, 0);
    
    // Get the current microtime as float in seconds
    $current_time = microtime(1);
    
    $upload_time = $current_time - $received_time;
    
    echo $received_time . " \n <BR />";
    echo $current_time . " \n <BR />";
    
    echo $upload_time;
    

    我在本地机器和网络中的远程机器上测试了它,文件大小为 700MB。

    【讨论】:

    • 在更新问题中所示的 php.ini 值后,我设法得到了这个答案。这实际上是一个非常好的解决方案,尤其是因为它只使用 PHP。
    【解决方案3】:

    似乎这个方法实际上工作得很好:

    1. 向存储会话时间戳的服务器发送 ajax 请求(就在表单发布之前)
    2. 张贴表格
    3. 检查接收端的差异:)

    HTML

    <?php session_start(); // must be at the top ?>
    
    <form id="upload-form" enctype="multipart/form-data" method="post">
        <input type="file" name="datafile" size="40">
        <input type="submit" value="Send">
    </form>
    
    <script type="text/javascript">
        $(function()
        {
            $('#upload-form').submit(function()
            {
                $.ajax({
                    url: 'start-timer.php',
                    type: 'POST',
                    context: this,
                    success: function() { this.submit(); },
                });
    
                return false;
            });
        });
    </script>
    

    start-timer.php

    <?php session_start();
    $_SESSION['time'] = microtime(true);
    

    上传.php

    <?php 
    session_start();
    header('content-type: text/plain; charset=utf-8');
    
    if( ! isset($_FILES['file'])
    ||  ! isset($_SESSION['time'])
    ||  $_FILES['file']['error'] !== UPLOAD_ERR_OK
    ||  ! is_uploaded_file($_FILES['file']['tmp_name']))
    {
        exit('stuff went wrong...');
    }
    
    $time = microtime(true) - $_SESSION['time'];
    unset($_SESSION['time']);
    echo round($time, 3).'s';
    

    工作样本:http://samples.geekality.net/upload-timer

    【讨论】:

    • 看起来很有希望。我会看看我是否可以让它工作,并在我这样做时编辑你的答案。
    • @GustavBertram 很好奇,所以在家里进行了测试,并让它工作。更新了答案并创建了一个工作示例:)
    • 嗨。实际上,我自己就让它工作了,并且我确实提交了对您的答案的更新,但我猜您的更新覆盖了这一点。 :) 你的答案非常好,但更令人惊讶的是我得到了 Apache 标头答案。
    • @Svish 我拿走了你的代码,但没有得到它的工作,总是得到一个“东西出错了......”,无论我上传什么文件。我意识到,在你上面的代码中是缺少action="upload.php",但即使有了它,在不同的服务器上也没有成功。如果您能再次检查您的代码,我将不胜感激,也许您能找到原因(不幸的是,我对 PHP 编程不够了解)。
    【解决方案4】:

    我有一个简单的逻辑

    上传图片时

    将开始时间保存在一个变量中并设置另一个变量,例如uploadStatus =0,然后在上传完成后将变量设置为uploadStatus = 1,并将结束时间保存在另一个变量中。

    上传时检查uploadStatus == 1,然后从结束时间减去开始时间,就得到上传时间。

    【讨论】:

    • 那么请修改我的示例脚本以显示您的解决方案,并将其放入您的答案中。
    【解决方案5】:

    您根本无法测量接收脚本中的任何内容。
    只是因为它是在上传(由网络服务器处理)结束后立即启动的。

    因此,正如 Svish 所说,会话中的 AJAX 调用和时间戳将是最简单的解决方案。

    【讨论】:

    • @iWantSimpleLife 已经证明这是错误的。他的 Apache 标头解决方案是纯 PHP 的,而且它确实有效。
    • 您要么不理解此解决方案,要么没有阅读我的答案。 没什么错了。 “Apache header”解决方案清楚地表明测量是由 Apache webserver 完成的,而不是 php 脚本。但是由于我写的原因,接收脚本本身不能测量任何东西。它只能得到别人完成的结果。更不用说 Apache 标头不是“纯 PHP 解决方案”,而是会话方法确实是纯 php,因为它不涉及其他任何内容。我的答案中没有任何内容与接受的答案相矛盾。可能您需要更好地了解 PHP 的工作原理。不要犹豫,问。
    • 那么这个解决方案呢? stackoverflow.com/questions/2931959/… 它甚至不需要更改 Apache。您只是在非常技术性和有限的意义上是正确的。虽然测量无法在 PHP 脚本中开始和结束,但至少有三种方法可以测量将文件上传到 PHP 脚本所需的时间。您的回答在技术上可能是正确的,但它没有用。
    • 我的答案有2分。 1. 它纠正了你错误的假设,即任何东西都可以在接收脚本内部进行测量——这是理解底层机制的一个非常重要的点。 2. 它有一个实用解决方案的大纲,您确认它是一个可行的解决方案。如果我是你,我不会说它没用。这似乎是个人的事情。
    【解决方案6】:

    我想是的,有 $_SERVER['REQUEST_TIME'] 变量表示 HTTP 请求的开始,所以在脚本的最开始:

    $upload_time = time() - $_SERVER['REQUEST_TIME'];
    

    结果将以秒为单位。

    【讨论】:

    • 很遗憾听到这个消息,但请注意这是您的服务器配置问题,而不是答案。
    • 正如你所说,确实是一个糟糕的服务器配置。不过,我也得到了一些有用的答案。另一个问题上的 Apache 标头解决方案实际上允许使用 microtime,其粒度比 REQUEST_TIME 更精细。我将请求合并这两个问题。
    • 目前是的,但是从 php 5.4 开始,REQUEST_TIME 也将包含微秒,因此它应该独立于 Web 服务器。
    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2014-05-07
    • 2018-12-10
    相关资源
    最近更新 更多