繁体   English   中英

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

[英]PHP: Redirect downloads request with nginx or apache with keeping session

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

此Web应用程序的功能之一是,已登录的用户可以下载多个文件,但是从Web服务器下载多个(大文件)(带有zip)会产生大量的I / O和CPU使用率,从而使Web服务器挂起另一个用户。

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

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

我要处理的另一个问题是: 大多数下载都涉及一个zip进程,而使用php则非常消耗cpu。 由于我不在乎zip压缩率,有没有办法在不进行真正压缩的情况下即时提供zip下载(使用任何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会话存储在数据库中
  • 下载(压缩)文件的猫大于1GB

这是个有趣的问题。 我个人将以与您建议的方式不同的方式进行此操作。

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

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

然后,下载服务器可以找到所需的文件,将其压缩,然后将其发送给用户。 然后,它可以在之后(甚至在下载开始之前)从表中删除该行,以便其他人无法再次使用该ID和身份验证代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM