2010-02-05 103 views
5

我有一个带有download.php页面的系统。该页面取和id并根据数据库记录加载一个文件,然后将其提供。我注意到几个实例在短时间跨度(20ms)内多次请求文件。对于人类投入来说太快了。有很多下载器功能正常的情况。但是,仔细看看下载器的用法,我确实看到了一些有趣的行为。Apache/PHP多次提供服务文件

例如,IP地址xxx.xxx.xxx.xxx(它是德国xxxxxx.de拥有的一个范围中的一个)通过Google来到网站。他们浏览并进入页面http://site.com/xxxx/press+125.php他们在那里在上午9:04:23发出了/download.php?id=/ZZ/n+aH55Y=(一个PDF)的请求。单凭这一点并不重要。然而,有趣的是,服务器似乎一直专注于满足这一要求。在日志中,请求首先在9:09:48和9:10:00之间完成。看起来用户在这段时间里肯定已经厌倦了等待,并且再次请求文档两次。在09:14:47和09:15:00之间,再次出现相同的请求,除了从第一次请求晚9点04分43秒,晚20毫秒。然后它会第三次弹出,请求在09:05:06 09:19:55和09:19:58之间完成!

我很怀疑那份文件。在查看日志时,我会看到其他实例,它需要服务器稍微处理该特定文件。查看文件/download.php?id=/ZZ/n+aH55Y=(与之前相同的文档)zzz.zzz.zzz.zzz [与上面不同]的请求列表:

请求时间完成时间 4时32分43秒4点33分36秒 4点32分50秒4点33分36秒 4时32分51秒4点33分38秒 4时33分05秒4点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进行访问。如果代码中存在某些不合理的情况,会导致系统触发占用服务器的多个下载请求,则需要进一步调查。

我不知道这个按+ 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; 
      } 
     } 
} 
+0

你在磁盘上看过这个PDF究竟有多大?它比任何其他文件都大吗?此外,你是在一个专用的服务器或共享主机? – Paolo 2010-02-05 15:07:35

+0

它大致相同。这是一个专用的盒子。 – easement 2010-02-05 15:47:32

回答

0

使用CDN网络文件下载。他们会为您处理此问题,并为您提供带宽和可扩展性。服务器上不再有锁定。 http://www.reelseo.com/free-cdn-velocix/

+0

CDN不是一个选项。一些项目是专有和保密的。我剥去了一些检测身份验证的代码。另外,还有一个管理员可以上传文件。 – easement 2010-02-05 15:49:24

0
  1. 你有没有分析用户代理和HTTP请求的Referer 头?
  2. 为什么不从Apache或任何你有的所有静态文件 ?如果你想跟踪 下载统计数据,你可以做你的脚本重定向到静态文件。
+0

有一些验证跟踪。查询国家和地区的数据库存在一些问题,然后将其写入日志文件。我们还需要捕获谁正在下载文件。 – easement 2010-02-05 15:50:38

0

将“%D%X”添加到您的日志配置中 - 我希望这会回答您的许多问题。

C.