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

PHP:使用nginx或apache重定向下载请求并保持会话,php,apache,session,nginx,download,Php,Apache,Session,Nginx,Download,我有一个php web应用程序,它运行在几个带有平衡器的服务器上 此web应用程序的一个功能是,登录用户可以下载多个文件,但从web服务器下载多个(和大的)文件(使用压缩)会造成大量i/o和cpu使用,从而使其他用户的web服务器挂起 因此,我的解决方案是有一个专用的下载服务器,运行相同的web应用程序(相同的代码),只提供下载请求 问题是:如何自动检测浏览器是否正在发送下载请求,并将其重定向到保持php会话的下载服务器(因为只有登录用户才能下载文件? 我正在处理的另一个问题是:大多数下载都涉及

我有一个php web应用程序,它运行在几个带有平衡器的服务器上

此web应用程序的一个功能是,登录用户可以下载多个文件,但从web服务器下载多个(和大的)文件(使用压缩)会造成大量i/o和cpu使用,从而使其他用户的web服务器挂起

因此,我的解决方案是有一个专用的下载服务器,运行相同的web应用程序(相同的代码),只提供下载请求

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

我正在处理的另一个问题是:大多数下载都涉及zip过程,使用php这非常耗费cpu。因为我不关心zip压缩比,有没有一种方法可以在不进行真正压缩的情况下(使用任何nginx头)动态提供zip下载? 例如:

详情:

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

    • 这是一个有趣的问题。我个人会用不同于你建议的方式来做

      允许从下载服务器连接到主服务器上的数据库,然后添加一个包含“id”、“文件”和“身份验证”等字段的新表

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


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

      这是我实际使用的方法。我试图在不涉及新表的情况下找到一个更好的方法。删除临时文件很困难,您需要知道文件何时准备好下载。我不确定我是否完全理解该问题。这些临时文件是什么?不能多长时间为下载文件做好准备?下载文件所需的用户流是什么?在身份验证方面,突然想到的一件事是打开一个与php的SSH连接,并在下载服务器上运行一个不可访问的脚本来准备文件,然后通过标准输出返回一个一次性下载URL。这样,所有身份验证ion在你的主服务器上,我几乎就这样结束了。我通过自动重定向到下载服务器(与web服务器代码相同)发送身份验证,设置了一个带有nonce-s和sing-on的小型身份验证系统。
      // 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));