zoukankan      html  css  js  c++  java
  • 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,理解扩展安装原理 

      

  • 相关阅读:
    [RxSwift]4.4、Operator
    [RxSwift]4.3.6、ControlProperty
    [RxSwift]4.3.5、Variable (已弃用)
    [RxSwift]4.3.0、Observable & Observer 既是可监听序列也是观察者
    [RxSwift]4.2.2、Binder
    [RxSwift]4.2.1、AnyObserver
    Java重温学习笔记,Java8新特性:接口的默认方法
    Tomcat下,MySQL连接池的配置和使用(Tomcat9,MySQL5.5)
    MyEclipse2020配置JDK1.8及Tomcat9
    Java重温学习笔记,Java7新特性
  • 原文地址:https://www.cnblogs.com/ghostwu/p/8472125.html
Copyright © 2011-2022 走看看