【问题标题】:php simultaneous file downloads from the same browser and same php script从同一浏览器和同一 php 脚本同时下载 php 文件
【发布时间】:2009-11-25 15:43:59
【问题描述】:
<?php

$filename= './get/me/me_'.rand(1,100).'.zip';

header("Content-Length: " . filesize($filename));
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename=foo.zip');

readfile($filename);
?>

嗨, 我有这个强制随机文件下载的简单代码,我的问题是,如果我从同一个浏览器调用脚本两次或更多次,第二次下载将不会开始,直到第一次下载完成或中断。因此,我每次只能下载一个文件。 你有什么线索吗?

【问题讨论】:

    标签: php file download


    【解决方案1】:

    这可能与 PHP 的会话处理有关。

    使用默认会话处理程序,当 PHP 脚本打开会话时,它会锁定它。需要访问它的后续脚本必须等到第一个脚本完成并解锁它(这会在关闭时自动发生,或者通过 session_write_close() 发生)。这将表现为脚本在前一个以与您描述的完全相同的方式完成之前不做任何事情。

    显然您没有明确启动会话,但有一个配置标志会导致会话自动启动:session.auto_start - http://www.php.net/manual/en/session.configuration.php

    要么使用 phpinfo() 来确定这是否设置为 true,要么查看您的配置。您也可以尝试将 session_write_close() 添加到脚本顶部,看看是否可以解决问题。

    【讨论】:

    • 通过搜索找到这个旧答案,然后 session_write_close();正是我所需要的。只需要确保在下载开始之前就调用它。谢谢!
    【解决方案2】:

    只是猜测。可能有不同的原因。

    首先,您的服务器可以限制并行连接或子节点的数量。但我想这不是问题

    其次,更有可能是客户端限制了连接数。 “普通”浏览器一次只打开两个到某个服务器的连接。现代浏览器最多允许 8 个 (?) 连接。这是一个简单的限制,以避免慢速服务器可能出现的问题。

    一种解决方法是将每次下载都放在一个“虚拟”子域中。

    试一试!

    【讨论】:

      【解决方案3】:

      只是说session_write_close(); 为我解决了问题。

      我使用的是session_destroy();(有效),但如果我需要保留会话数据,效果并不好 :)

      您只需在开始流式传输文件数据之前放置session_write_close();

      例子:

      <?php
      $filename= './get/me/me_'.rand(1,100).'.zip';
      
      session_write_close();
      
      header("Content-Length: " . filesize($filename));
      header('Content-Type: application/zip');
      header('Content-Disposition: attachment; filename=foo.zip');
      
      readfile($filename);
      ?>
      

      【讨论】:

      • 我发现的第一个解决方案提到将 session_write_close() 放在文件流数据之前。
      【解决方案4】:

      我会进一步调查 Ralf 关于服务器限制的建议,并首先检查日志文件以确保服务器完全接收到第二个请求。有了这些知识,您就可以消除其中一种可能性,至少可以看出问题出在哪一边。

      从客户端的浏览器 - 你没有提到它是哪一个 - 如果是 Firefox,请尝试安装 Live Http Headers 扩展程序,看看你发送的请求会发生什么,以及浏览器是否收到来自服务器端的任何响应。

      【讨论】:

        【解决方案5】:

        据我所知,没有限制最大下载或类似内容的 php 配置设置 - 此外,这样的配置超出了 php 的范围。

        因此,我只能得出两个结论:

        • 首先是这是浏览器行为,看看问题是否在多个浏览器中重复出现(如果是,请告诉我)。 HTTP 规范确实说在任何时候都应该只有两个到同一个域的连接应该处于活动状态,但我不知道受影响的文件下载以及页面下载。绕过这种限制的一种方法是将多个子域分配给同一站点(或执行一个涵盖所有子域的 DNS 条目),并在生成下载链接时,选择一个随机子域进行下载.如果是浏览器问题,这应该可以解决多请求问题。

        • 第二个也是更不可能的选项是(这仅适用于您使用 Apache),您的 MaxKeepAliveRequests 配置选项设置为低得离谱,并且启用了 KeepAlives。但是,我非常怀疑这是问题所在,因此我建议调查浏览器的可能性。

        您是在启动第二次下载时从浏览器收到错误消息,还是只是挂起?如果它只是挂起,这表明它是一个浏览器问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 2011-10-20
          相关资源
          最近更新 更多