最近在搞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);
|