PHP:使用nginx或apache重定向下载请求并保持会话

时间:2014-11-29 10:25:51

标签: php apache session nginx download

我在一台带有平衡器的服务器上运行了一个php Web应用程序。

此Web应用程序的功能之一是已记录的用户可以下载多个文件,但从Web服务器下载多个(和大)文件(使用压缩)会产生大量的i / o和cpu使用,从而使Web服务器挂起对于其他用户。

所以我的解决方案是让专用的下载服务器运行相同的Web应用程序(相同的代码),并且只提供下载请求。

问题是:如果浏览器正在发送下载请求,我如何自动检测,并将其重定向到保持php会话的下载服务器(因为只有登录用户可以下载文件?

我正在处理的另一个问题是:大多数下载涉及一个zip进程,使用php这非常消耗cpu。由于我不关心压缩比率,有没有一种方法可以在不进行真正压缩的情况下即时提供拉链下载(带有任何nginx标题)? 例如:

// Download several files via mod_zip
$spec = array();
foreach ($downloads as $download) {
    $fileSize = filesize($download['file']);
    $spec[] = sprintf("%d %s %s\n", $fileSize, $download['file'], $download['name']);
}
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="files-' . date ("YmdHs") . '.zip"');
header('X-Archive-Files: zip');
die(implode($spec));

详细说明:

  • Web服务器正在使用nginx作为代理服务器和apache
  • 运行
  • PHP会话存储在数据库中
  • 下载(压缩)文件cat大于1GB

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。我个人会以不同于你建议的方式做到这一点。

允许从下载服务器连接到主服务器上的数据库,然后添加一个新表,其中包含“id”“files”和“auth”等字段。

当用户请求下载时,将它们重定向到主服务器上的php页面,该页面将向表中写入一行描述要下载的文件及其的auth代码,然后将用户重定向到页面上您的下载服务器,将ID和auth字段作为GET变量传递。

然后,下载服务器可以找到所需的文件,将其压缩然后发送给用户。然后它可以删除表中的行(甚至在下载开始之前),这样就没有其他人可以再次使用该id和auth代码了