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