NGINX / PHP - 无法通过php脚本提供jpeg

时间:2017-10-24 20:45:06

标签: php nginx

以下脚本是微不足道的,可以正常运行apache而不会出现问题

header('Content-Type: image/jpeg');
echo file_get_contents('./photo.jpg');

在NGINX / PHP-FPM上,我得到一个空白页面。我尝试了两种不同的虚拟服务器。我创造的一个,宅基地改进了基于Laravel Homestead的箱子(https://github.com/Swader/homestead_improved)。

错误报告已启用,没有错误。如果我删除标题,只需使用:

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开发者工具中,下载完整图片并显示在“网络”标签中。浏览器正在获取数据,但未显示。

2 个答案:

答案 0 :(得分:0)

你的问题在于进程内存。 PHP在PHP-FPM下运行时使用不同的配置文件,然后在Apache下运行时使用。

file_get_contents的问题在于它将整个文件读入内存。对于图像文件,内存达到其限制,http响应永远不会完成。

要解决此问题,您可以使用fopen流式传输图像,或者增加PHP-FPM php的内存限制。

答案 1 :(得分:0)

就像Scriptonomy所说,记忆可能是一个问题。您也可以使用readfile

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