【发布时间】:2011-02-25 07:03:19
【问题描述】:
是否有可能知道(服务器端)文件上传所用的时间?我有一个图片上传 API,在我的回复中我想返回上传时间(不包括脚本执行时间)。
【问题讨论】:
-
向我们展示您用于上传文件的代码
-
通过将文件作为 multipart/form-data 发布到我的 api url 来上传文件
是否有可能知道(服务器端)文件上传所用的时间?我有一个图片上传 API,在我的回复中我想返回上传时间(不包括脚本执行时间)。
【问题讨论】:
在 Apache 2.2.22 和 PHP 5.2.17 中,我使用 apache_response_headers() 引导和 flush() 命令,另一种方式它不起作用,我收到带有一个变量的标题。 ob_end_flush() 没有帮助我。 $_SSERVER 的 REQUEST_TIME 变量是优雅的等价物,但请注意这适用于 PHP 5.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 之间的时间?
可能需要做一些测试,因为我还没有尝试过。让我知道它是否有效... :)
更新由@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 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';
【讨论】:
action="upload.php",但即使有了它,在不同的服务器上也没有成功。如果您能再次检查您的代码,我将不胜感激,也许您能找到原因(不幸的是,我对 PHP 编程不够了解)。
我有一个简单的逻辑
上传图片时
将开始时间保存在一个变量中并设置另一个变量,例如uploadStatus =0,然后在上传完成后将变量设置为uploadStatus = 1,并将结束时间保存在另一个变量中。
上传时检查uploadStatus == 1,然后从结束时间减去开始时间,就得到上传时间。
【讨论】:
您根本无法测量接收脚本中的任何内容。
只是因为它是在上传(由网络服务器处理)结束后立即启动的。
因此,正如 Svish 所说,会话中的 AJAX 调用和时间戳将是最简单的解决方案。
【讨论】:
我想是的,有 $_SERVER['REQUEST_TIME'] 变量表示 HTTP 请求的开始,所以在脚本的最开始:
$upload_time = time() - $_SERVER['REQUEST_TIME'];
结果将以秒为单位。
【讨论】:
REQUEST_TIME 更精细。我将请求合并这两个问题。
REQUEST_TIME 也将包含微秒,因此它应该独立于 Web 服务器。