ubuntu:通过封装验证码类库一步步安装php的gd扩展
我相信很多人的lamp环境都是直接复制一堆参数安装进去的,这里有可能成功,也有可能失败,如果是新手,估计要碰到各种错误,就算安装成功,也未必知道那些参数是干嘛的,反正装进去能用就行。
我当初开始的时候也是这样, 完全一脸懵逼,直到我后来进修了( C语言,Linux,Linux系统编程,计算机原理等 )才能玩转服务器配置,理解原理。
本文通过一个经典的验证码功能,告诉你如何按需安装扩展!!!
要封装一个php的验证码类库,那么需要gd扩展的支持,由于我之前的php是精简编译安装的,没有gd库的支持,所以要先安装php的gd库
要想成功安装gd库,需要安装很多的依赖: zlib, png, jpeg, libiconv, freetype
1,zlib我之前在安装 php memcache的扩展时候,已经安装过了
2,安装png
wget http://prdownloads.sourceforge.net/libpng/libpng-1.5.4.tar.gz?download
mv libpng-1.5.4.tar.gz\?download libpng-1.5.4.tar.gz
tar xf libpng-1.5.4.tar.gz
cd libpng-1.5.4/
./configure
make && sudo make install
3,安装jpeg
wget http://www.ijg.org/files/jpegsrc.v9b.tar.gz
tar xf jpegsrc.v9b.tar.gz
cd jpeg-9b/
./configure
make && sudo make install
4,安装libiconv
wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar xf libiconv-1.15.tar.gz
cd libiconv-1.15/
./configure
make && sudo make install
5,安装freeType
wget https://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.gz
tar xf freetype-2.9.tar.gz
cd freetype-2.9/
./configure
make && sudo make install
6,到了最关键的地方了,安装php gd扩展
切换到php原码包下 ext/gd 这个目录
>先执行phpize外挂模块( /usr/local/php54/bin/phpize )
>./configure --with-php-config=/usr/local/php54/bin/php-config -with-png-dir --with-freetype-dir --with-jpeg-dir -with-zlib-dir --with-gd
>make && sudo make install
开始封装php验证码库,最后效果
1 <?php 2 3 class Captcha { 4 //验证码字符个数 5 protected $num; 6 //宽度 7 protected $width; 8 //高度 9 protected $height; 10 //资源 11 protected $im; 12 //类型: 1:纯数字, 2:纯字母 3:数字与字母混合 13 protected $codeType; 14 //生成的验证码字符串 15 protected $codeString; 16 17 public function __construct( $_num = 4, $_width = 150, $_height = 50, $_codeType = 3 ){ 18 $this->num = $_num; 19 $this->width = $_width; 20 $this->height = $_height; 21 $this->codeType = $_codeType; 22 $this->codeString = $this->createCodeString(); 23 } 24 25 public function __get( $name ) { 26 if( $name == 'codeString' ) { 27 return $this->codeString; 28 } 29 return false; 30 } 31 32 protected function createCodeString(){ 33 switch( $this->codeType ){ 34 case 1: 35 $code = $this->createNumCode(); 36 break; 37 case 2: 38 $code = $this->createCharCode(); 39 break; 40 case 3: 41 $code = $this->createNumCharCode(); 42 break; 43 default: 44 die( "暂时没有其他的验证码类型,你可以继承这个类来添加额" ); 45 } 46 return $code; 47 } 48 49 protected function createNumCode(){ 50 $numString = join( "", range( 0, 9 ) ); 51 return substr( str_shuffle( $numString ), 0, $this->num ); 52 } 53 54 protected function createCharCode(){ 55 $charString = join( "", range( 'a', 'z' ) ); 56 $charString .= strtoupper( $charString ); 57 return substr( str_shuffle( $numString ), 0, $this->num ); 58 } 59 60 protected function createNumCharCode(){ 61 $numCharString = join( "", range( 0, 9 ) ); 62 $charString = join( "", range( 'a', 'z' ) ); 63 $charString .= strtoupper( $charString ); 64 $mixedString = $numCharString . $charString; 65 return substr( str_shuffle( $mixedString ), 0, $this->num ); 66 } 67 68 protected function createCanvas(){ 69 $this->im = imagecreatetruecolor( $this->width, $this->height ); 70 } 71 72 protected function fillCanvas( $type ){ 73 switch( $type ) { 74 case 1: 75 $color = imagecolorallocate( $this->im, mt_rand( 0, 150 ), mt_rand( 0, 150 ), mt_rand( 0, 150 ) ); 76 break; 77 case 2: 78 $color = imagecolorallocate( $this->im, mt_rand( 150, 255 ), mt_rand( 150, 255 ), mt_rand( 150, 255 ) ); 79 break; 80 default: 81 die( "不支持的填充类型" ); 82 break; 83 } 84 imagefill( $this->im, 0, 0, $color ); 85 } 86 87 protected function drawCodeString(){ 88 for( $i = 0; $i < $this->num; $i++ ){ 89 $fontColor = imagecolorallocate( $this->im, mt_rand( 0, 255 ), mt_rand( 0, 255 ), mt_rand( 0, 255 ) ); 90 $char = $this->codeString[$i]; 91 $x = ( $i * ( ($this->width) / $this->num ) ) + mt_rand( 5, 10 ); 92 $y = mt_rand( 0, $this->height / 2 ) + mt_rand( 5, 10 ); 93 imagestring( $this->im, 5, $x, $y, $char, $fontColor ); 94 } 95 } 96 97 protected function renderImage(){ 98 header( "Content-type:image/png" ); 99 imagepng( $this->im ); 100 } 101 102 protected function fillDisturb(){ 103 for( $i = 0; $i < 100; $i++ ){ 104 $color = imagecolorallocate( $this->im, mt_rand( 0, 255 ), mt_rand( 0, 255 ), mt_rand( 0, 255 ) ); 105 imagesetpixel( $this->im, mt_rand( 0, $this->width ), mt_rand( 0, $this->height ), $color ); 106 } 107 } 108 109 public function render(){ 110 //创建画布/背景 111 $this->createCanvas(); 112 //填充画布颜色 113 $this->fillCanvas( 1 ); 114 //填充干扰元素 115 $this->fillDisturb(); 116 //填充验证码 117 $this->drawCodeString(); 118 //显示验证码 119 $this->renderImage(); 120 } 121 } 122 123 $capt = new Captcha(); 124 //echo $capt->codeString . PHP_EOL; 125 $capt->render(); 126 ?>
小结:
1,复习类库的封装
2,理解扩展安装原理