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验证码库,最后效果

<?php
class Captcha {
//验证码字符个数
protected $num;
//宽度
protected $width;
//高度
protected $height;
//资源
protected $im;
//类型: 1:纯数字, 2:纯字母 3:数字与字母混合
protected $codeType;
//生成的验证码字符串
protected $codeString;
public function __construct( $_num = 4, $_width = 150, $_height = 50, $_codeType = 3 ){
$this->num = $_num;
$this->width = $_width;
$this->height = $_height;
$this->codeType = $_codeType;
$this->codeString = $this->createCodeString();
}
public function __get( $name ) {
if( $name == 'codeString' ) {
return $this->codeString;
}
return false;
}
protected function createCodeString(){
switch( $this->codeType ){
case 1:
$code = $this->createNumCode();
break;
case 2:
$code = $this->createCharCode();
break;
case 3:
$code = $this->createNumCharCode();
break;
default:
die( "暂时没有其他的验证码类型,你可以继承这个类来添加额" );
}
return $code;
}
protected function createNumCode(){
$numString = join( "", range( 0, 9 ) );
return substr( str_shuffle( $numString ), 0, $this->num );
}
protected function createCharCode(){
$charString = join( "", range( 'a', 'z' ) );
$charString .= strtoupper( $charString );
return substr( str_shuffle( $numString ), 0, $this->num );
}
protected function createNumCharCode(){
$numCharString = join( "", range( 0, 9 ) );
$charString = join( "", range( 'a', 'z' ) );
$charString .= strtoupper( $charString );
$mixedString = $numCharString . $charString;
return substr( str_shuffle( $mixedString ), 0, $this->num );
}
protected function createCanvas(){
$this->im = imagecreatetruecolor( $this->width, $this->height );
}
protected function fillCanvas( $type ){
switch( $type ) {
case 1:
$color = imagecolorallocate( $this->im, mt_rand( 0, 150 ), mt_rand( 0, 150 ), mt_rand( 0, 150 ) );
break;
case 2:
$color = imagecolorallocate( $this->im, mt_rand( 150, 255 ), mt_rand( 150, 255 ), mt_rand( 150, 255 ) );
break;
default:
die( "不支持的填充类型" );
break;
}
imagefill( $this->im, 0, 0, $color );
}
protected function drawCodeString(){
for( $i = 0; $i < $this->num; $i++ ){
$fontColor = imagecolorallocate( $this->im, mt_rand( 0, 255 ), mt_rand( 0, 255 ), mt_rand( 0, 255 ) );
$char = $this->codeString[$i];
$x = ( $i * ( ($this->width) / $this->num ) ) + mt_rand( 5, 10 );
$y = mt_rand( 0, $this->height / 2 ) + mt_rand( 5, 10 );
imagestring( $this->im, 5, $x, $y, $char, $fontColor );
}
}
protected function renderImage(){
header( "Content-type:image/png" );
imagepng( $this->im );
}
protected function fillDisturb(){
for( $i = 0; $i < 100; $i++ ){
$color = imagecolorallocate( $this->im, mt_rand( 0, 255 ), mt_rand( 0, 255 ), mt_rand( 0, 255 ) );
imagesetpixel( $this->im, mt_rand( 0, $this->width ), mt_rand( 0, $this->height ), $color );
}
}
public function render(){
//创建画布/背景
$this->createCanvas();
//填充画布颜色
$this->fillCanvas( 1 );
//填充干扰元素
$this->fillDisturb();
//填充验证码
$this->drawCodeString();
//显示验证码
$this->renderImage();
}
}
$capt = new Captcha();
//echo $capt->codeString . PHP_EOL;
$capt->render();
?>
小结:
1,复习类库的封装
2,理解扩展安装原理
ubuntu:通过封装验证码类库一步步安装php的gd扩展的更多相关文章
- 将当前的Ubuntu系统封装成为可以安装(发布)的iso镜像
将当前的Ubuntu系统封装成为可以安装(发布)的iso镜像 在使用以上方法安装依赖的时候xresprobe 会找不到安装地址,采用下面的方式: Package xresprobe is not in ...
- Ubuntu学习总结-01 用VMware 8安装Ubuntu 12.04详细过程
1 Ubuntu 下载地址 http://www.ubuntu.com/download/desktop 2 安装Ubuntu 转载用VMware 8安装Ubuntu 12.04详细过程 http:/ ...
- Ubuntu安装MongoDB和PHP扩展
MongoDB是一个可伸缩的,高性能的开源NoSQL 文档数据库.主要用C++开发完成.面向文档存储,全索引支持,可复制和高可用性,自动分片等特征.其在非关系型数据库中是功能最丰富,最像关系型数据库 ...
- Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置
Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置 http://henzhai.com/tech/2012/07/w520- ...
- ubuntu常用命令及操作,包括安装CUDA
chmod Document 这里Document是一个文件夹,文件夹中还有好多子文件,可以发现执行了这条指令以后,其子文件夹的权限并没有改变. 要想改变其子文件夹的权限,应该执行 Document/ ...
- ubuntu 用remastersys 备份系统并且安装
sudo add-apt-repository ppa:mutse-young/remastersys 2.更新系统软件源 sudo apt-get update 3.更新完了,先安装remaster ...
- Linux(Ubuntu)使用 sudo apt-get install 命令安装软件的目录在哪?(已解决)
Linux(Ubuntu)使用 sudo apt-get install 命令安装软件的目录在哪? bin文件路径: /usr/bin 库文件路径: /usr/lib/ 其它的图标啊什么的路径 ...
- ubuntu 12.04及12.10无法安装 ia32-libs
administrator@ubuntu:~$ sudo apt-get install ia32-libs [sudo] password for administrator: 正在读取软件包列表 ...
- Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用【转】
本文转载自:http://www.linuxdiyf.com/linux/24086.html Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用 发布时间:2016-09 ...
随机推荐
- Node之简单的前后端交互
node是前端必学的一门技能,我们都知道node是用的js做后端,在学习node之前我们有必要明白node是如何实现前后端交互的. 这里写了一个简单的通过原生ajax与node实现的一个交互,刚刚学n ...
- ThinkPhp_5框架开发【指导】
================================================== ThinkPhp_5环境安装指导 -------------------------------- ...
- Asp.net mvc 中Action 方法的执行(二)
[toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...
- 使用wrk进行性能测试
1 wrk介绍 wrk是一款现代化的HTTP性能测试工具,即使运行在单核CPU上也能产生显著的压力.它融合了一种多线程设计,并使用了一些可扩展事件通知机制,例如epoll and kqueue. 一个 ...
- jQuery中foreach的continue和break
摘录自:http://blog.csdn.net/penginpha/article/details/12159389 1. continue. 可以使用return. $("***&quo ...
- Vue.js的坑
参考网址:http://cn.vuejs.org/v2/guide/components.html 1.camelCase vs. kebab-case HTML 特性不区分大小写.当使用非字符串模版 ...
- 如何让你的.vue在sublime text 3 中变成彩色?
1.打开sublime,按住shift+Ctrl+P,回车 2.输入Vue Syntax Highlight(因为我的已经装过了,所以这里没有显示) 3.选择Vue Syntax Highlight, ...
- [转]如何使用PHP实现javascript的escape和unescape函数
前端开发工程师都知道javascript有编码函数escape()和对应的解码函数unescape(),而php中只有个urlencode和urldecode,这个编码和解码函数对encodeURI和 ...
- Linux 查找命令汇总
linux下查找命令挺多,本文以列表方式说明which.whereis.locate.find命令的区别: 命令 概述 语法 示例 适用OS 搜索结果 which 在PATH变量指定的路径中,搜索某个 ...
- Servlet--ServletInputStream类,ServletOutputStream类
ServletInputStream类 定义 public abstract class ServletInputStream extends InputStream 这个类定义了一个用来读取客户端的 ...