我有一个带有download.php页面的系统。该页面接受一个id并加载基于DB记录的文件,然后提供服务。我注意到有几个实例在短时间内(20ms)多次请求文件。这样的时间对于人类输入来说太快了。有很多情况下下载器功能正常。但是,在更仔细地查看下载器的使用情况时,我确实看到了一些有趣的行为。
例如,IP地址 xxx.xxx.xxx.xxx(属于德国的xxxxxx.de拥有的范围之一)通过Google访问了该网站。他们浏览了一下,然后来到了页面http://site.com/xxxx/press+125.php。在那里,他们请求下载一个名为 /download.php?id=/ZZ/n+aH55Y= 的PDF文件,时间是上午9:04:23。这本身不是什么大事。然而,有趣的是服务器似乎非常忙于处理该请求。在日志中,该请求首次完成时间在9:09:48和9:10:00之间。看起来用户在那段时间内已经等得有些疲倦,并要求再次获取该文档。在09:14:47和09:15:00之间,同样的请求再次出现,只是比第一次请求晚20毫秒,时间是9:04:43 AM。然后它第三次弹出,请求开始于09:05:06,在09:19:55和09:19:58之间完成!
我对那份文件持怀疑态度。在查看日志时,我发现服务器处理该特定文件需要一段时间。请查看zzz.zzz.zzz.zzz(与上述不同)请求/download.php?id=/ZZ/n+aH55Y=(与之前相同的文档)的请求列表:
请求时间 完成时间 04:32:43 04:33:36 04:32:50 04:33:36 04:32:51 04:33:38 04:33:05 04:33:38 04:33:34 04:33:42 04:33:05 04:33:42
因此,肯定出了些问题。无论是这个特定文件使服务器出现故障,还是download.php页面的代码,或者我们只是看到了某些服务器级别的超载证据,正在实时播放中,我还不确定。
公平地说,还有其他人下载 /download.php?id=/ZZ/n+aH55Y=(同一PDF文件)而没有出错的情况。然而,有趣的是,多个进程似乎只发生在这一个文件中,而且只有当通过页面http://site.com/press+125.php访问时才会发生。如果代码内部存在某些问题导致系统触发多个下载请求占用服务器,则需要进一步调查此事。
我不知道这个 press+125.php 是否是一个兔子洞,但确实有奇怪的巧合。
有什么想法吗?我完全没有主意。Apache 超负荷了吗?这样的事情。
例如,IP地址 xxx.xxx.xxx.xxx(属于德国的xxxxxx.de拥有的范围之一)通过Google访问了该网站。他们浏览了一下,然后来到了页面http://site.com/xxxx/press+125.php。在那里,他们请求下载一个名为 /download.php?id=/ZZ/n+aH55Y= 的PDF文件,时间是上午9:04:23。这本身不是什么大事。然而,有趣的是服务器似乎非常忙于处理该请求。在日志中,该请求首次完成时间在9:09:48和9:10:00之间。看起来用户在那段时间内已经等得有些疲倦,并要求再次获取该文档。在09:14:47和09:15:00之间,同样的请求再次出现,只是比第一次请求晚20毫秒,时间是9:04:43 AM。然后它第三次弹出,请求开始于09:05:06,在09:19:55和09:19:58之间完成!
我对那份文件持怀疑态度。在查看日志时,我发现服务器处理该特定文件需要一段时间。请查看zzz.zzz.zzz.zzz(与上述不同)请求/download.php?id=/ZZ/n+aH55Y=(与之前相同的文档)的请求列表:
请求时间 完成时间 04:32:43 04:33:36 04:32:50 04:33:36 04:32:51 04:33:38 04:33:05 04:33:38 04:33:34 04:33:42 04:33:05 04:33:42
因此,肯定出了些问题。无论是这个特定文件使服务器出现故障,还是download.php页面的代码,或者我们只是看到了某些服务器级别的超载证据,正在实时播放中,我还不确定。
公平地说,还有其他人下载 /download.php?id=/ZZ/n+aH55Y=(同一PDF文件)而没有出错的情况。然而,有趣的是,多个进程似乎只发生在这一个文件中,而且只有当通过页面http://site.com/press+125.php访问时才会发生。如果代码内部存在某些问题导致系统触发多个下载请求占用服务器,则需要进一步调查此事。
我不知道这个 press+125.php 是否是一个兔子洞,但确实有奇怪的巧合。
有什么想法吗?我完全没有主意。Apache 超负荷了吗?这样的事情。
///DOWNLOAD.php
$file = new files();
$file->comparison_filter("id", "=", $id); //sql to load
if ($file->load()) {
$file->serve();
}
//FILES
function serve() {
if ($this->is_loaded) {
if (file_exists($this->get_value("filename"))) {
if ($this->get_value("content_type") != "") {
header("Content-Type: " . $this->get_value("content_type"));
}
header("Content-Length: " . filesize($this->get_value("filename")));
if ($this->get_value("flag_image") == 0 || $this->get_value("flag_image") == false) {
header("Cache-Control: private");
header("Content-Disposition: attachment; filename=" . urlencode($this->get_value("original_filename")));
}
set_time_limit(0);
@readfile($this->get_value("filename"));
exit;
}
}
}