gd-输出图片流

最近在搞laravels项目,由于laravels是通过swoole来加速laravel的,php-fpm模式下的一些输出函数受到了干扰,比如:header(),在laravels下返回输出和header头的设定需要由response()来完成.但是gd的输出就比较特别了,它要么输出网页,要么输出文件.如果想要输出二进制流再交给PHP就比较麻烦了,网上普遍的方案就是先把gd图像输出到缓存文件里,再读取出来.可是在要有占用了太多的磁盘I/O

➡️问题

gd直接输出到网页我们后台无法很好的设置header来标注文件类型.

➡️方案

gd先输出到文件,在用file_get_contents读取.
缺陷:太过于占用磁盘I/O
gd的输出先由ob缓存下来,再用ob_get_contents获取.
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ob_start();
switch ($type) {
case 'jpg':
case 'jpeg':
$type = 'image/jpeg';
imagejpeg($this->image, '', 0.5);
break;
case 'png':
$type = 'image/png';
imagepng($this->image);
break;
case 'bmp':
$type = 'image/vnd.wap.wbmp';
imagewbmp($this->image);
break;
case 'gif':
default:
$type = 'image/gif';
imagegif($this->image);
break;
}
$contents = ob_get_contents();
ob_end_clean();
return response($content)
->header('Content-type', $type);