繁体   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