流出大文件时冻结

时间:2015-02-10 10:28:37

标签: php

使用fread()可以流式传输大文件以强行下载。 但是,在流式传输过程中,所有的php请求都将被阻止,直到流式传输结束。如何在流媒体处理过程中处理传入的请求?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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