2015-02-10 49 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的其他請求。

另一種解決此問題的方法是切換到基於數據庫的會話處理。在這種情況下,必須花更多的心思來不丟失書面數據,但總的來說這是可能的。