是否有可能知道(服务器端)file upload的时间? 我有一个图像上传API,在我的回应中,我想返回上传时间(不包括脚本执行时间)。
我想是的,有$_SERVER['REQUEST_TIME']
变量,表示HTTP请求的开始,所以在脚本的一开始:
$upload_time = time() - $_SERVER['REQUEST_TIME'];
结果将在几秒钟内。
实际上似乎这个方法工作很好:
<?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>
<?php session_start(); $_SESSION['time'] = microtime(true);
<?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
您根本无法测量接收脚本内的任何内容。
仅仅因为它是在上传(由网络服务器处理)之后立即开始的。
所以,正如Svish所说,会话中的AJAX调用和时间戳将是最简单的解决方案。
看看链接。
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的文件。
在Apache 2.2.22和PHP 5.2.17上,我使用了apache_response_headers()引导与flush()命令,另一种方式,它不工作,我收到一个变量头。 ob_end_flush()没有帮助我。 $ _SSERVER的REQUEST_TIME变量是相当优雅的,但请注意,这是从PHP 5.1开始的。
我有一个简单的逻辑
当图像发布上传
将变量的起始时间保存在变量中,然后为uploadStatus = 0设置另一个变量,然后在上传完成后将变量设置为uploadStatus = 1,并将结束时间保存在另一个变量中。
上传时请检查uploadStatus == 1,然后从结束时间减去开始时间,您将获得上传时间。