2017-10-12 60 views
0

我有一個很奇怪的問題。 我有一個在Apache2.4下的ubuntu服務器上運行的網站。 該網站是用PHP編寫的,並使用MySQL作爲數據庫。 我已經實現了「文件存儲」作爲longblobs在MySQL數據庫中的小文件。Apache2服務器/網站在下載過程中停止響應

當我想從MySQL數據庫下載一個blob /文件時,我打開一個到數據庫的PDO連接。

$sql = $pdoData->prepare("SELECT * FROM fileblob WHERE ID = ?"); 
$sql->execute(array($blobID)); 
$row = $sql->fetch(); 
$content = $row['data']; 

通過「echo $ content」然後我將文件傳輸到瀏覽器。 所有這些工作完美無瑕。然而。在下載過程中,整個站點停止響應,每個新請求都會超時。 下載繼續正常。

當下載剩餘4MB時,網站會重新開始運行,但速度很慢。完成後,該網站已完全恢復正常。

MySQL數據庫使用一個InnoDB後臺,有一個最大的500個併發連接等

在下載的時候,都只有6打開SQL連接。 Apache的磁盤使用率最高爲20%左右,CPU使用率低於10% Apache也設置爲處理1k個併發連接(10個線程,最多有100個子項)。服務器通過無法計量的1Gbps線路連接。 我想不出任何硬件瓶頸。

我錯過了什麼? 我很高興回答您的任何問題......

+0

什麼是你的輸出緩衝設置?你在腳本中使用PHP會話嗎? – CBroe

+0

@CBroe是的,我正在逐字地使用PHP會話。輸出緩衝區設置爲4096 – user3829915

+0

_「輸出緩衝區設置爲4096」_ - 這可以解釋爲什麼你看到的效果在4MB左右變化...嘗試禁用它的這個請求/腳本的一部分。此外,一旦完成會話,請使用session_write_close - 否則,會話數據文件上的文件鎖定也會使併發請求「掛起」。 – CBroe

回答

0

當您使用PHP的默認基於文件的會話機制時,PHP會在訪問該特定會話的任何腳本正在運行時鎖定會話數據文件。

因此,當您的下載正在運行時,會話數據文件始終保持打開狀態,並且任何其他腳本都無法訪問同一會話 - 它們只需等待,直到文件鎖再次釋放。

爲了防止發生這種情況,可以使用session_write_close。它告訴PHP當前腳本是通過操作會話數據完成的,因此會話內容可以立即寫入數據文件,並釋放文件鎖定,以便其他腳本可以再次訪問它。

(你顯然需要與在這一點上你的會話數據操作完成的。你不能在同一個腳本再次更改會議內容之後)

相關問題