2012-09-02 26 views
5

基本上,我想向瀏覽器發送一個頭文件X-Sendfile來發送文件,但是如果X-Sendfile不可用或者未安裝在服務器上,我不想調用它。我如何檢查這在PHP?或者,如果這不可能在PHP中檢查,而不是如何檢查它是否安裝PERIOD?我寧願檢查PHP中是否存在X-Sendfile,因爲這樣做對我來說會更容易,因爲這是可以在其他站點和服務器上運行的包的一部分......也許如果我只是使用它與PHP header函數,它會返回一些東西,如果沒有安裝??PHP - 如何確定X-Sendfile是否可用並已安裝?

謝謝你們:)

回答

6

的Apache模塊mod_xsendfile過程頭

要檢查Apache模塊mod_xsendfile可用,並且安裝在服務器上,你可以使用apache_get_modules()功能。

您不能只設置標題並檢查模塊是否安裝。

+0

保存你的「謝謝」給別人。我非常樂意幫助你。 – verisimilitude

+3

不要忘記:模塊可能會被加載(列在apache_get_modules()中,但可能不會被啓用(它甚至在默認情況下被禁用)。您不能使用PHP來檢查這個模塊。 – marcovtwout

0

試試這個:

if (in_array('mod_xsendfile', apache_get_modules())) { 
     header("X-Sendfile: $file"); 
    } else { 
     error_log("Warning! mod-xsendfile is NOT INSTALLED - sending file the old fashion way....."); 
     header('Content-Length: ' . filesize($file)); 
     print file_get_contents($file); 
    } 
+0

爲什麼不使用readfile舊時尚方式「? –

+2

xsendfile將退出PHP並釋放內存,並允許apache使用DMA /硬件加速發送文件。如果使用readfile,您將數據通過多個緩衝區並複製到內存中(PHP將文件讀入內存 - > php輸出緩衝區 - > apache輸出緩衝區 - >網絡緩衝區)所有這些都是在處理器中完成的,而不是sendfile(apache告訴Harddrive使用DMA直接將文件加載到內存中,apache通知網卡通過讀取發送數據直接從內存中,處理器可以自由地做其他事情而不是不必要的內存拷貝) – RobertMaysJr

+0

我不是在辯論xsendfile的優點,而是以「舊時尚的方式」打印。即使回聲比打印快,第二個讀取文件比兩者都要快,特別是如果您必須先回調file_get_contents才能回顯它。 –

0

這是不正確的。如果相關位置的XSendFile未設置爲On,但該模塊已加載,則會錯誤地假定xsendfile的用法可用,儘管不是。

相關問題