2012-04-05 45 views
0

的下載腳本的相關代碼:當用戶正在下載時,他們爲什麼不能加載另一個頁面?

$fp = @fopen($file, 'rb'); 

while(!feof($fp) && ($p = ftell($fp)) <= $end) { 

    if ($p + $buffer > $end) { 
     $buffer = $end - $p + 1; 
    } 
    echo fread($fp, $buffer); 
    flush(); 
    if($limits["Max_DL"]) sleep(1); 
} 

fclose($fp); 

同時下載過程中,任何其他頁面的同一站點不負載。但他們仍然在另一個瀏覽器中加載。我認爲這與下載頁面不斷「加載」以阻止其他頁面加載有關?

關於如何解決這個問題的任何建議?對於大文件,我不希望用戶無法瀏覽網站,而他們正在下載的過程中

+0

這似乎是一個HTTP服務器的問題。你在使用哪個服務器,如果它是apache,你使用哪個php插件?如果我是對的,這應該去serverfault.com – 2012-04-05 00:45:34

+0

Apache版本\t 2.2.19和PHP版本\t 5.2.17但如果我下載文件「直接」(不是通過PHP腳本)我不會遇到這個問題,其他在同一個服務器上託管的頁面/網站正確加載,其真正只是與此用戶系統相關的任何頁面(因爲下載需要登錄) – cwal 2012-04-05 00:49:46

+0

您是否使用apache-mpm-working?你指的是什麼用戶系統? PHP的CGI或MOD_php?我並不是很瞭解這些,但通常你所說的事情不應該發生。 – 2012-04-05 00:56:37

回答

0

PHP不是傳遞大文件的最佳解決方案,因爲您將佔用服務器上的進程每個用戶的整個下載時長;如果您使用Apache或nginx,則應該使用mod_xsendfileXSendfile來查看文件。

如果這是不可能的,您可以通過使用readfile()函數來嘗試簡化文件的傳輸過程。

+0

以及我使用php,因爲我需要限制下載到登錄用戶只,確保他們只下載他們有權訪問的文件,節制他們的下載速度......我會研究讀取文件現在感謝 – cwal 2012-04-05 01:01:37

3

如果您的下載腳本在任何時候都調用session_start(),則在將文件傳輸給用戶之前,您需要先撥session_write_close()

這會關閉PHP會話文件,並允許用戶加載另一個頁面,該頁面可能正在調用session_start(因此正在等待會話文件的鎖定)。

注意:調用session_write_close()之後仍然可以讀取$_SESSION,但任何修改都將被丟棄 - 您剛剛告訴PHP您已完成對會話的更改。

更多信息: http://us2.php.net/manual/en/function.session-write-close.php

+0

我早就放棄了這個項目,儘管我仍然有源碼,它不再被託管在任何地方。這個答案似乎是最有意義的,但不能接受它,因爲我無法測試它。謝謝。 – cwal 2014-01-14 21:57:56

相關問題