[英]NGINX/PHP - Cannot serve jpeg via php script
以下腳本是微不足道的,並且沒有問題就可以正常運行apache
header('Content-Type: image/jpeg');
echo file_get_contents('./photo.jpg');
在NGINX / PHP-FPM上,我得到一個空白頁面。 我嘗試了兩種不同的虛擬服務器。 一個我創建的,宅基地改進了盒子( https://github.com/Swader/homestead_improved ),它基於Laravel Homestead。
錯誤報告已啟用,沒有錯誤。 如果我刪除標題,只需使用:
echo file_get_contents('./photo.jpg');
我把二進制轉換為ASCII並看到奇怪的字符; 正確加載文件。
我認為問題可能是缺少標題,所以我嘗試了內容長度:
header('Content-Type: image/jpeg');
$contents = file_get_contents('./photo.jpg');
header('Content-length: ' . strlen($contents));
echo $contents;
這會產生不同的結果:頁面永遠不會加載,就像瀏覽器永遠不會收到它所期望的所有字節一樣。
如果我打印strlen($contents)
它會以字節為單位顯示文件大小。 PHP正在正確加載圖像,但它永遠不會到達瀏覽器。
該腳本適用於Apache服務器,因此問題似乎是NGINX或PHP-FPM。
我嘗試過不同的圖像(一個80kb,一個2.2mb),結果是一樣的。 我也嘗試過readfile
而不是file_get_contents
。
在Chrome開發者工具中,會下載完整圖像並顯示在“網絡”標簽中。 瀏覽器正在獲取數據,但不會顯示。
你的問題在於進程內存。 PHP在PHP-FPM下運行時使用不同的配置文件,然后在Apache下運行時使用。
file_get_contents
的問題在於它將整個文件讀入內存。 對於映像文件,內存達到其限制,http響應永遠不會完成。
要解決此問題,您可以使用fopen
流式傳輸圖像或增加PHP-FPM php的內存限制。
就像Scriptonomy所說,記憶可能是一個問題。 您也可以使用readfile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.