PHP的GD库freetype编译安装问题及解决办法

首先说明:

  1. 我的环境是Mac OS X,大家知道mac是基于unix,所以从源代码编译安装三步曲:./configure 、 make 、 make install 是都知晓的。
  2. 编译安装三步曲,是可以无限重复进行的。当然有时你要make clean一下。

在一些带验证码、做水印、一些图片处理的PHP项目中,要用到GD库(从PHP 4.3.0开始,绑定到PHP源代码的ext里),在./configure时,使用 --with-gd安装。通常GD库主要有libpng\libjpeg\freetype2\t1lib这四个依赖,而libpng需要zlib(unix/linux系统都会有这个库,不用自己下载安装)。
libpng\libjpeg\ freetype2 \t1lib 这四个库,就要自己先安装好
三种方式:

  1. 从他们的官网中下载稳定版,从源码安装,安装到/usr/local(./configure --prefix=/usr/local)
  2. yum apt-get等方式安装(我的mac没装这几个命令,所以我没有采用这种方式)
  3. 这个方式仅限Mac:Homebrew ———— The missing package manager for OS X,可去其github看文档,安装后几个简单命令,就把这些依赖的库安装好了,非常方便。

现在,我们已经解决了GD的所有依赖,只要在./configure时加上以下几个配置项:

--with-gd --with-zlib --with-png-dir=/usr/local --with-jpeg-dir=/usr/local --with-freetype-dir=/usr/local --with-t1lib=/usr/local 

再 sudo make 、 sudo make install 就完事了!
gd.png

遇到的一些问题:

  1. Mac是自带PHP的,版本稍旧一点且源码也没有了,不如把自带的干掉,重新编译安装一个(比如PHP 5.5)!系统默认的PHP安装在/usr,我们自己通常安装在/usr/local里。
    彻底删除自带的PHP:
cd /private/etc/
sudo rm -rf php-fpm.conf.default php.ini php.ini.default
cd /usr/bin/
sudo rm -rf php php-config phpdoc phpize
cd /usr/include
sudo rm -rf php
cd /usr/lib
sudo rm -rf php
cd /usr/sbin
sudo rm -rf php-fpm
cd /usr/share
sudo rm -rf php
cd /usr/share/man/man1
sudo rm -rf php-config.1 php.1 phpize.1
cd /usr/share/man/man8
sudo rm -rf php-fpm.8
  1. 因为不断试用关于GD的这几个配置项,我编译安装三步曲起码进行了十多次。你会发现第一次编译安装时间很长,之后重复编译安装很快就完成了,是因为有一些步骤就跳过了。所以改了一些配置项,phpinfo()中的预期的GD的信息却没有。所以重复三步曲前,make clean 进行一下就ok了。

我的配置项:./configure --prefix=/usr/local/php --enable-mbstring --with-apxs2=/usr/sbin/apxs --with-mysql --with-pdo-mysql --enable-zip --with-mysqli --with-curl=/usr/local/opt/curl
说明:
--with-apxs2=/usr/sbin/apxs 这个配置项是针对Apache2.x版本,=[DIR]为apxs命令的位置
--with-curl=/usr/local/opt/curl 详见curl安装

经典排序算法

  1. 冒泡
$arr = array(3,44,38,5,47,15,36,26,27,2,46,4,19,50,48);
$arr = array(2,3,4,5,15,19,26,27,36,38,44,46,47,48,50);
$times = 0;//记录比较的次数
$len=count($arr);
//控制需要冒泡的轮数
for($i=1;$i<$len;$i++){
  $swapped = false;//[优化]跳出循环之用
  //控制每轮 冒出一个数 需要比较的次数
  for($k=0;$k<$len-$i;$k++){
    $times += 1;
    if($arr[$k]>$arr[$k+1]){
      $tmp=$arr[$k+1];
      $arr[$k+1]=$arr[$k];
      $arr[$k]=$tmp;
      $swapped = true;
    }
  }
  $times += 1;
  if(!$swapped)
    break;
}
echo $times;print_r($arr);

冒泡排序无论代码怎么实现,交换的次数是同样。不同的是,设计良好的算法对于排序良好的输入,进行比较的次数会骤减。

  1. 插入排序
function insert_sort(&$arr){
    $sum = count($arr);
    for($i=1;$i<$sum;$i++){
        $tmp=$arr[$i];
        $key=$i-1;
        while($key>=0 && $tmp<$arr[$key]){
            $arr[$key+1]=$arr[$key];
            $key--;
        }
        $key != $i-1 && $arr[$key+1] = $tmp;//如果有移动,就插入
    }
}
  1. 希尔排序
function shell_sort(&$arr)
{
    if(!is_array($arr)) return;
    $n = count($arr);
    for($gap=floor($n/2);$gap>0;$gap=floor($gap/=2))
    {
        for($i=$gap;$i<$n;++$i)
        {
            for($j=$i-$gap;$j>=0 && $arr[$j+$gap]<$arr[$j];$j-=$gap)
            {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+$gap];
                $arr[$j+$gap] = $temp;
            }
        }
    }
}
  1. 选择排序
function selection_sort(&$array){
    $count=count($array);
    for($i=0;$i<$count-1;$i++){
        /*findtheminest*/
        $min=$i;
        echo'$min-->'.$array[$min].'-->';
        for($j=$i+1;$j<$count;$j++){
            //由小到大排列
            if($array[$min]>$array[$j]){
                //表明当前最小的还比当前的元素大
                $min=$j;
                //赋值新的最小的
            }
        }
        echo$array[$min].'coco<br/>';
        /*swap$array[$i]and$array[$min]即将当前内循环的最小元素放在$i位置上*/
        if($min!=$i){
            $temp=$array[$min];
            $array[$min]=$array[$i];
            $array[$i]=$temp;
        }
    }
}
  1. 快速排序
function quickSort($arr){
    if(count($arr)>1){
        $k=$arr[0];
        $x=array();
        $y=array();
        $size=count($arr);
        for($i=1;$i<$size;$i++){
            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }elseif($arr[$i]>$k){
                $y[]=$arr[$i];
            }
        }
        $x = quickSort($x);
        $y = quickSort($y);
        return array_merge($x,array($k),$y);
    }else{
        return $arr;
    }
}
  1. 选择排序
function selectSort(&$arr){
    $n = count($arr);
    for($i=0; $i<$n-1; $i++){
        $min_k = $i;
        $min_v = $arr[$i];
        for($j = $i+1; $j<$n; $j++){
            if($arr[$j] < $min_v){
                $min_v = $arr[$j];
                $min_k = $j;
            }
        }
        $arr[$min_k] = $arr[$i];
        $arr[$i] = $min_v;
    }
}

随时分享一些小工具

1. 一行js代码,做一个浏览器书签,一个简单生硬的计算器就出来了

1.png

实现非常简单,书签管理器添加一个书签,url处填上

javascript:    var e = "", r="";    do {      e = prompt("表达式: " + e + "\n" + r + "\n", e);      try { r = "计算结果: " + eval(e); }      catch(ex) { r = ex; }    } while(e);    void 0;

2.png

weibo实习5个月学习成长简短总结

2015年1月13日入微博实习,迄今已有5个月之久,且说说自己学习成长收获。
整个实习期间只做了一个投票产品,工作上还是比较轻松的。所以不以时间为线索来谈,直接说说学习到哪些干货吧。
我主要做投票pc端、h5端、feed的落地页。

  1. 单一个落地页需要处理展现的信息就比较多,包括发起人、好友参与(双向关系)、投票本身、投票选项、话题信息、相关投票等等。投票的状态有:主他 * 是否结束 * 是否参与 * 结果是否可见 * 图文 等十多种。
  2. 是多端的细节处理和ajax接口提供,h5要在微博客户端上有很多要协调处理之处。
  3. 微博投票系二级内容产品,涉及对象库、配置平台、主站的多方协作,同时兼顾业务、产品的需求,整个开发调试过程也是比较锻炼人的。
  4. 再小的问题,当你考虑大并发量的时候,都不再是简单的问题。要设计memcache缓存、程序内缓存,设计参与投票走mcq队列,假数据输出。

HTML,CSS,Javascript接触不多,但以前自学过,掌握还算可以。
关于PHP,微博投票两次版本分别应用了kohana、yaf框架,so我学习了两套框架的设计思路,路由的设计等。学会了原生的模版写法:
MVC设计中,假设controller中数据准备$items变量,然后赋值给模板,再渲染、response。

<?php
...
Class Controller_Items extends Controller{
    public function listAction(){
        $items = Model::Factory('items')->select()->limit(5)->execute();
        $this->assign('items',$items);
    }
}

在模板文件中应该是这样的:

<?php foreach($items as $k=>$item): ?>
    <p>this is item <?=$K?>, it's value is <?=$item['value']?></p>
<?php endforeach; ?>

PHP编译安装:configure make make test & make install
PDO作为PHP扩展为PHP访问数据库定义了一个轻量级的一致接口,而PDO_MYSQL扩展则实现了PDO接口,来连接mysql数据库。当然PDO的出现,是为了使PHP能平滑游走在诸多RDBMS中,所以我们只要选择不同的数据库驱动扩展来实现PDO就可以了。
对Apache/Nginx见此的编译、安装、配置基本掌握。
Linux的管道、strace系统调用、关于log的tail -f 等调试技术的学习
还有一个主要的成长就是写代码的功力:

  • 代码重用
    投票落地页涉及多端展现,但处理逻辑大体上是一致的,所以在基本完成pc、h5的controller处理逻辑时,翔哥让我把多端共用的逻辑提炼出来放到ModelPoll_Comm类里。之后再做修改时,真的体会到代码重用的好处和必要性。

  • 数据迁移
    投票产品的这次新改版不止前端优化更改,后端的数据库设计、PHP框架都有所变更,并且迁移要保证在用户无感知的情况下完成,所以要明确整个迁移的流程by宇哥,物理迁移、逻辑迁移,开启双写,迁移后,队列缓存数据写入等。

  • PHP架构设计
    主要分yaf路由、models、modules、library、data、config几个部分。核心路由功能,在config 中配置,交由yaf完成;modules是应用模块,包括pc、h5、cli、openapi、internal、API等;models与data配合,关于数据的增删查改处理逻辑;library提供应用使用的各种类库。

以上只是就学到的方面做个简短说明,其实还学习到很多,好的坏的嘎嘎,就不说了~

---------- 以下情怀,高能勿入 ----------

首先感谢牛总,给机会,给予支持和理解。感谢翔哥宇哥给予教导。感谢峰哥,感谢宗稳
感谢台网团队,给成长锻炼的机会,(吃了好多顿免费的午餐~~)
热爱coding,但coding不是全部,运营、产品都是非常重要的。一个好的工程师绝不是一个码农,有责任心,擅于沟通,嗯,加油!

2015.4.21流水日记

起得颇早,乘公交,8点半到公司。
9点开始准备,与jser联调的测试数据~
10点联调
12点去吃午饭,回来坐一会。
14点正式开工,自己调试。
调调歇歇,19点下班,乘公交回学校。
东门买些小吃,回到宿舍。
歇会,9点用室友电脑,玩了一把LOL。
快10点躺床休息下,逗比室友们玩起了成语接龙。
十多分钟后,产生的一个结论是:重庆的语文教育止于小学。hiahia
下床准备一下明天的《系统工程学》考试,没多久困得不行,躺床睡了~~~~