代码之家  ›  专栏  ›  技术社区  ›  easement

apache/php多次提供文件

  •  5
  • easement  · 技术社区  · 15 年前

    我有一个带download.php页面的系统。该页获取并标识一个基于数据库记录的文件,然后将其送达。我注意到有几个实例在短时间(20毫秒)内多次请求文件。时间太快,不适合人类输入。在很多情况下,下载程序运行良好。然而,在仔细观察下载程序的使用情况时,我确实看到了一些有趣的行为。

    例如,IP地址xxx.xxx.xxx.xxx(在德国属于xxxxxx.de的一个范围内)是通过谷歌到达该站点的。他们浏览了一下,然后来到那一页。 http://site.com/xxxx/press+125.php 他们在那里发出了/download.php的请求?上午9:04:23,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之间完成!

    我怀疑那份文件。在查看日志的过程中,我看到了服务器处理该特定文件需要一些时间的其他实例。查看来自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页面代码,或者只是在实时im中看到一些服务器级过载的证据还不确定。

    公平地说,还有其他人下载/download.php的例子吗?id=/zz/n+ah55y=(相同的pdf)没有错误。然而,有趣的是,多个进程似乎只发生在这个文件上,并且只有在通过页面访问它时才会发生 http://site.com/press+125.php . 如果代码中有错误导致系统触发占用服务器的多个下载请求,则需要进一步调查。

    我不知道这个press+125.php是不是一个兔子洞,但有一个奇怪的一致性。

    有什么想法吗?我完全没主意了。阿帕奇疯了?诸如此类的事情。

    ///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;
                }
            }
    }
    
    3 回复  |  直到 15 年前
        1
  •  0
  •   Pentium10    15 年前

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

        2
  •  0
  •   Yaroslav    15 年前
    1. 你分析过用户代理和 HTTP请求中的引用头?
    2. 为什么不提供所有静态文件 是从阿帕奇还是其他什么地方来的?如果你想追踪 下载统计信息您可以从脚本重定向到静态文件。
        3
  •  0
  •   symcbean    15 年前

    将'%d%x'添加到日志配置-我希望这将回答您的许多问题。

    C.

    推荐文章