欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

php中验证码图像输出不了,使用ob_clean()解决

程序员文章站 2024-02-19 14:57:04
...

以下是一个还算可以的验证码类:

<?php
namespace Frame\Vendor;
class Verify
{
	private $x=80;
	private $y=30;
	private $img=null;
	private $str='';
	public function show()
	{
		$this->x=80;
		$this->y=30;
		$this->ini1();
		$this->rangshu();
		$this->printhua();
	}
	private function ini1()
	{
		$this->img=imagecreatetruecolor($this->x,$this->y);
		$color1=imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
		imagefill($this->img,0,0,$color1);
	}
	private function rangshu()
	{
		$color2=imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
		$color3=imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
		//随机产生四位数的字符串
		$arr1=range('0','9');
		$arr2=range('a','z');
		$arr3=range('A','Z');
		$arr=array_merge($arr1,$arr2,$arr3);
		shuffle($arr);
		$str2='';
		$str1=array_rand($arr,4);
		foreach ($str1 as $value) 
		{
			$this->str.=$arr[$value];
		}
		echo $this->str;
		$_SESSION['verify']=$this->str;
		//的到四位数后旧才是化矩形填充
		imagefilledrectangle($this->img,0,0,$this->x,$this->y,$color2);
		//填加字符串
		$filename=INDEX_PATH."Public".DS."Admin".DS."Images".DS."msyhbd.ttf";
		imagettftext($this->img,18,0,8,25,$color3,$filename,$this->str);

	}
	public function printhua()
	{
		for($i=0;$i<150;$i++)
		{
			$color4=imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
			imagesetpixel($this->img,mt_rand(0,$this->x),mt_rand(0,$this->y),$color4);
		}
		for($i=0;$i<10;$i++)
		{
			$color4=imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
			imageline($this->img,mt_rand(0,$this->x),mt_rand(0,$this->y), mt_rand(0,$this->x), mt_rand(0,$this->y),$color4); 
		}
		//在输出钱要告诉浏览器这个格式
		//header("Content-type:image/png");
		ob_clean();//清除缓存
		header('Content-type:image/png');
		imagepng($this->img);
		//print_r($this->img);
	}
		
}

在此过程给,我的验证码这个图像不能以图像的方式输出,尽管我没有任何错误,也设置 了header(‘Content-type:image/png’);

但是我在header(‘Content-type:image/png’);前加个ob_clean();就可以进行输出了,这是为什么呢?

首先我来讲以下ob_clean()是用来干什么的吧!

ob_clean()是用来清楚缓存的

数据的输出输入首先要先进入缓存,当缓存没有满时是不会自动进行删除,在此时你在输出验证码图像,他会把你缓存中的数据误认为是验证码图片,所以就会一起输出,造成验证码无法输出的结局