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

ubuntu:通过封装验证码类库一步步安装php的gd扩展

程序员文章站 2022-03-25 23:00:58
我相信很多人的lamp环境都是直接复制一堆参数安装进去的,这里有可能成功,也有可能失败,如果是新手,估计要碰到各种错误,就算安装成功,也未必知道那些参数是干嘛的,反正装进去能用就行。 我当初开始的时候也是这样, 完全一脸懵逼,直到我后来进修了( C语言,Linux,Linux系统编程,计算机原理等 ......

我相信很多人的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验证码库,最后效果

ubuntu:通过封装验证码类库一步步安装php的gd扩展

  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,理解扩展安装原理