簡體   English   中英

NGINX / PHP - 無法通過php腳本提供jpeg

[英]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

https://secure.php.net/manual/en/function.readfile.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM