2015-02-10 45 views
2

使用fread()可以流式传输大文件以强制下载。 但是,在流式传输过程中,所有的php请求都会被阻塞,直到流式传输完成。如何在流式传输过程中处理传入的请求?冻结期间流出大文件

+0

你使用的是Apache吗?如果是这样,请查看大文件的mod_xsendfile:https://tn123.org/mod_xsendfile/ – 2015-02-10 10:30:57

+1

您的意思是说,如果流在'streaming.php'上运行,并且我调用'anotherpage.php',则后者将不会运行流式传输结束了吗? – 2015-02-10 10:31:40

+2

在fread之前调用'session_write_close'。 – GhostGambler 2015-02-10 10:53:59

回答

1

如果使用session_start来利用脚本的会话功能并且不会更改任何默认值,那么缺省行为是基于文件的会话处理。

文件一次只能通过打开进程打开。因此,如果脚本启动并呼叫session_start,则该特定会话文件被锁定。如果具有相同会话ID的另一个请求启动,则下一个对session_start的调用将暂停,直到文件锁再次被锁定为空。

在正常情况下,这完全没有问题,因为在很短的时间间隔内很少有多个具有相同会话ID的请求,但是如果一个请求执行异常长的例如因为它将大量数据传输回调用客户端,因此获取文件锁的时间相当长。

幸运的是,在大多数情况下,在此次执行时甚至不再需要会话,因此可以在脚本结束时尽早关闭会话,并释放文件锁定。之后,可以例如传输大量数据而不干扰具有相同会话ID的其他请求。

另一种解决此问题的方法是切换到基于数据库的会话处理。在这种情况下,必须花更多的心思来不丢失书面数据,但总的来说这是可能的。