场景:
今天线下写好的程序,两个人开发,经过[GitEE]码云合并之后现在部署了一套在服务器,但是验证码总是碎图不展示。XDebug、PHP、apache均无错误信息。
经搜索,验证码最后用的
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);
return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');
缓冲区获取生成的png图片内容返回输出
问题原因:
1、代码(包括vender composer扩展)中有BOM头文件,自己的文件可能性较大。
2、获取内容
ob_get_clean
之前有输出或者中断。
其中,不发有可能第二种,其实基本是第一种问题居多
解决办法:
百度也好,自己费力查询也罢,无外乎两种办法:
1、缓冲内容前面clear一下,再开始。
// 重点----start
ob_clean();
// 重点----end
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);
return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');
2、看看是否前面输出内容是BOM头,如果是的话就去改为UTF-8无BOM头格式。
解决步骤:
重点写下第二种解决办法吧。
1、取出头部缓冲区内容:
$content = ob_get_clean();
var_dump(empty($content), $content);die;
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);
return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');
输出内容:
bool(false) string(3) ""
空字符,是否empty为否,还有3个字符长度,看起来像是字符无法展示,而展示的空,,,技术受限,如果转为Ascii码的话估计能判断出是啥字符
2、修改下输出为Ascii码
$content = ob_get_clean();
var_dump(empty($content), $content, ord($content));die;
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);
return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');
bool(false) string(3) "" int(239)
经过百度一些博客得知[那三个特殊字符的ascii码239,187,191就是BOM头的 EF BB BF]确实有个239是BOM头的Ascii码,文章地址:https://taotaoit.com/article/details/567.html
既然如此,我们可以找到我们当前项目内哪个文件没有删除BOM头,找个批量查找工具查找,用notepadd++改为无BOM头即可
我用的,会附上百度地址:
链接:https://pan.baidu.com/s/1SPAVLASRmp42AYZiday3lA 密码:47ah