2013-02-19 58 views
0

我正在使用CURL從外部URL下載大文件並將其保存在我的服務器上。 這可能需要幾分鐘的時間。 雖然下載運行時我使用curl_setopt($ CH,CURLOPT_PROGRESSFUNCTION,..運行匿名函數週期性與當前下載更新的信息我的$ _SESSION [「download_progress」]變量。PHP:如何在一個頁面上使用會話,而另一個頁面正在加載sesson

現在,這一切都是在發生upload.php的文件,當用戶等待文件下載使用JavaScript來請求包含以下簡單的代碼progress.php頁:

session_start(); 
echo $_SESSION['download_progress']; 

這讓我的JavaScript代碼來顯示有關信息下載進度。

除非無法正常工作。

直到「upload.php」完成加載(換句話說,兩個頁面只在文件完成下載後才加載),「progress.php」頁面纔會加載,這是不好的。 session_start()以某種方式阻止加載「progress.php」頁面。 我使用我自己的服務器(apache + php 5.4),所以我有所有管理員權限。

我怎樣才能解決這個問題? 我可以使用一些醜陋的解決方法,如將下載信息寫入txt文件而不是會話變量,然後使用javascript直接讀取該txt文件,但我寧願不這樣做。

感謝

+0

據我所知,你應該工作,除非兩個文件都從同一個文件調用。例如,如果你有index.php?some_setting_to_load_load.php和index.php?some_setting_to_load_progress.php 你有沒有在線測試過,看看你是否得到不同的結果? – 2013-02-19 19:59:58

回答

3

你有經典的問題,文件系統支持的會話。您的上傳腳本鎖定會話支持文件的持續時間,因此在釋放鎖定之前無法訪問會話信息。

這裏有幾種可能的解決方案,但最簡單的方法是上傳腳本定期釋放會話並再次鎖定;這會讓您的進度腳本在此期間讀取會話。

要釋放會話鎖定,請在上傳腳本的任意位置調用session_write_close。這會使您無法訪問會話變量,除非稍後再次致電session_start。您可以儘可能多地重複此循環。

還有其他更強大的解決方案。例如,您可以將進度信息移動到某個存儲機制,該機制在腳本持續時間內不會保持鎖定狀態;你可以根據他們的會話ID來識別每個用戶的信息(你不需要開始會話來獲得它的ID,如果存在的話)。

+0

非常好,這正是我需要的。 – user2079305 2013-02-19 20:09:59

+0

有用的解釋性信息。 – Edward 2016-04-04 21:03:37

+0

其他人也提到過這個,這個答案的作者指出它是好的。另一個信息來源是http://php.net/manual/en/function.session-start.php#101452,鏈接到http:// konrness的描述。com/php5/how-to-prevent-blocking-php-requests/ – Edward 2016-04-05 07:26:39

相關問題