检测文件上传所需的时间(PHP)

时间:2010-05-28 19:37:44

标签: php upload

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

6 个答案:

答案 0 :(得分:8)

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

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

结果将以秒为单位。

答案 1 :(得分:6)

似乎这种方法实际上非常好用:

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

  4. 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>
    

    启动timer.php

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

    upload.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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

查看链接。

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?

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

UPDATE BY @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。

答案 4 :(得分:0)

在Apache 2.2.22和PHP 5.2.17中,我使用apache_response_headers()使用flush()命令,另一种方式它不起作用,我接收带有一个变量的头。 ob_end_flush()没有帮助我。 $ _SSERVER的REQUEST_TIME变量优雅等效,但注意这可以从PHP 5.1开始。

答案 5 :(得分:-2)

我有一个简单的逻辑

发布图片进行上传时

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

在上传时检查uploadStatus == 1,然后从结束时间中减去开始时间,您将获得上传时间。