• 2009-11-20

    php引用符号(&)的作用 - [php]

    php的引用(就是在变量或者函数、对象等前面加上&符号)

    PHP 中引用的意思是:不同的名字访问同一个变量内容.
    与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址

    变量的引用

    PHP 的引用允许你用两个变量来指向同一个内容

    <?
    $a="ABC";
    $b =&$a;
    echo $a;//这里输出:ABC
    echo $b;//这里输出:ABC
    $b="EFG";
    echo $a;//这里$a的值变为EFG 所以输出EFG
    echo $b;//这里输出EFG
    ?>


    函数的传址调用
    传址调用我就不多说了 下面直接给出代码

    function test(&$a)
    {
    $a=$a+100;
    }
    $b=1;
    echo $b;//输出1
    test($b);  //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
    echo "<br>";
    echo $b;//输出101

    要注意的是,在这里test(1);的话就会出错,原因自己去想

    函数的引用返回
    先看代码

    function &test()
    {
    static $b=0;//申明一个静态变量
    $b=$b+1;
    echo $b;
    return $b;
    }

    $a=test();//这条语句会输出 $b的值 为1
    $a=5;
    $a=test();//这条语句会输出 $b的值 为2

    $a=&test();//这条语句会输出 $b的值 为3
    $a=5;
    $a=test();//这条语句会输出 $b的值 为6

    下面解释下: 
    通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
    PHP规定通过$a=&test(); 方式得到的才是函数的引用返回
    至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂

    用上面的例子来解释就是
    $a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
    而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
    即产生了相当于这样的效果($a=&b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
    $a=&test();
    $a=5;
    以后,$b的值变为了5

    这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中

    对象的引用

    <?
    class a{
    var $abc="ABC";
    }
    $b=new a;
    $c=$b;
    echo $b->abc;//这里输出ABC
    echo $c->abc;//这里输出ABC
    $b->abc="DEF";
    echo $c->abc;//这里输出DEF
    ?>

    以上代码是在PHP5中的运行效果
    在PHP5中 对象的复制 是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
    PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP定义了一个特殊的方法,称为__clone.

    引用的作用
    如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。


    取消引用
    当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

    <?php
    $a = 1;
    $b =& $a;
    unset ($a);
    ?>  

    不会 unset $b,只是 $a。


    global 引用
    当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

    <?php
    $var =& $GLOBALS["var"];
    ?>  

    这意味着,例如,unset $var 不会 unset 全局变量。

    $this
    在一个对象的方法中,$this 永远是调用它的对象的引用。


    //下面再来个小插曲
    php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

    通俗的讲
    1:如果有下面的代码

    $a="ABC";
    $b=$a;

    其实此时 $a与$b都是指向同一内存地址 而并不是$a与$b占用不同的内存

    2:如果在上面的代码基础上再加上如下代码

    $a="EFG";

    由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储

    Tag:php
  • 2009-11-17

    一些PHP的Tips,面试会遇到 - [php]

     

    HTTP协议中几个状态码的含义:503 500 401 200 301 302
        2xx: (成功)
        3xx (重定向)
        4xx: Client Error 使用者端(浏览器)错误讯息
        5xx: Server Error  服务器端错误讯息
        400(错误请求)     服务器不理解请求的语法。
        401(未授权)     请求要求身份验证。对于登录后请求的网页,服务器可能返回此响应。
        500(服务器内部错误)     服务器遇到错误,无法完成请求。
        503(服务不可用)     服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。

    Include require include_once require_once 的区别.
        require() :如果文件不存在,会报出一个fatal error.脚本停止执行
        include() : 如果文件不存在,会给出一个 warning,但脚本会继续执行
        _once: 会检测是否包含过了,包含过了就不包含了

    关于HereDOC:
        <?php
        $a = "---------";
        echo <<<HAHA
        $a
        \$a
        HAHA
        ?>
        输出:   -----------
                    $a

    关于php的魔法引用:
        如果php.ini不可改,可以使用.htaccess文件禁用,加入下面的代码 php_flag magic_quotes_gpc Off
        相关函数:stripslashes — 去掉反斜杠,得到原始数据。       addslashes — 使用反斜线引用字符串

        最好设置为OFF,然后自己过滤,在PHP6中已经关闭了,或者用下面的函数:
        if (get_magic_quotes_gpc())
        {
            function stripslashes_deep($value)
            {
                $value = is_array($value)?array_map('stripslashes_deep',$value):stripslashes($value);
                return $value;
            }
            $_GET     = array_map('stripslashes_deep', $_GET);
            $_POST    = array_map('stripslashes_deep', $_POST);
            $_COOKIE  = array_map('stripslashes_deep', $_COOKIE);
            $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
        }

    一些编译php时的configure 参数
    1.作为APACHE模块编译
    –with-apxs2
    2.作为fastcgi编译
    –enable-fastcgi
    –enable-force-cgi-redirect
    3.动态加载PHP的extension
    加载模块的后面加上shared关键词
    例如–with-gd=shared
    4.enable的扩展选项一样可以使用shared关键词作为外部扩展模块载入
    5.with-EXTENSIONS-dir和单纯的with-EXTENSIONS的作用相同
    同样是指定加载特定模块
    只是可以指定目录
    ./configure --prefix=/usr/local/php --with-config-file-path=/etc \
    --with-apxs2 --enable-fastcgi --enable-force-cgi-redirect \
    --with-gd=shared \
    --with-jpeg-dir \
    --with-png-dir \
    --with-zlib-dir \
    --enable-gd-native-ttf \
    --with-freetype-dir=shared \
    --with-zlib=shared \
    --with-mysql=shared \
    --with-mcrypt=shared \
    --with-pear=shared \
    --with-curl=shared \
    --with-curlwrappers=shared \
    --with-xmlrpc=shared \
    --without-sqlite --disable-debug --disable-rpath \
    --enable-mbstring=shared \
    --enable-exif=shared \
    --enable-zip=shared \
    --enable-ftp=shared

    Safe_mode 打开后哪些地方受限.
    启动safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数。

    解决多进程/线程同时读写一个文件的问题

    对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些!!用一般的文件操作方法完全没有问题。但如果并发高,在我们对文件进行读写操作时,很有可能多个进程对进一文件进行操作,如果这时不对文件的访问进行相应的独占,就容易造成数据丢失。

    对于这样的问题,一般的解决方案时当一进程对文件进行操作时,首先对其它进行加锁
    所以一般的方案是:
    $fp = fopen("/tmp/lock.txt", "w+");
    if (flock($fp, LOCK_EX)) {
        fwrite($fp, "Write something here\n");
        flock($fp, LOCK_UN);
    } else {
        echo "Couldn't lock the file !";
    }
    fclose($fp);

    但在PHP中,flock似乎工作的不是那么好!在多并发情况下,似乎是经常独占资源,不即时释放,或者是根本不释放,造成死锁,从而使服务器的cpu占用很高,甚至有时候会让服务器彻底死掉。好像在很多linux/unix系统中,都会有这样的情况发生。

    如果不考虑使用flock()函数,也同样会有很好的解决方案来解决我们的问题。
    方案一:对文件进行加锁时,设置一个超时时间.

    if($fp = fopen($fileName, 'a')) {
        $startTime = microtime();
        do {
                $canWrite = flock($fp, LOCK_EX);
            if(!$canWrite) usleep(round(rand(0, 100)*1000));
        } while ((!$canWrite) && ((microtime()-$startTime) &lt; 1000));
        if ($canWrite) {
          fwrite($fp, $dataToSave);
        }
        fclose($fp);
    }
    超时设置为1ms,如果这里时间内没有获得锁,就反复获得,直接获得到对文件操作权为止,当然。如果超时限制已到,就必需马上退出,让出锁让其它进程来进行操作。
    方案二:不使用flock函数,借用临时文件来解决读写冲突的问题。
    大致原理如下:
    1。将需要更新的文件考虑一份到我们的临时文件目录,将文件最后修改时间保存到一个变量,并为这个临时文件取一个随机的,不容易重复的文件名。
    2。当对这个临时文件进行更新后,再检测原文件的最后更新时间和先前所保存的时间是否一致。
    3。如果最后一次修改时间一致,就将所修改的临时文件重命名到原文件,为了确保文件状态同步更新,所以需要清除一下文件状态。
    4。但是,如果最后一次修改时间和先前所保存的一致,这说明在这期间,原文件已经被修改过,这时,需要把临时文件删除,然后返回false,说明文件这时有其它进程在进行操作。

    方案四:将所有要操作的进程放入一个队列中。然后专门放一个服务完成文件操作。
    队列中的每一个排除的进程相当于第一个具体的操作,所以第一次我们的服务只需要从队列中取得相当于具体操作事项就可以了,如果这里还有大量的文件操作进程,没关系,排到我们的队列后面即可,只要愿意排,队列的多长都没关系。
    参考:http://hqlong.com/2009/01/530.html

    使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567

    先php.ini配置中打开mod_rewrite。然后在.htaccess文件中写入:ErrorDocument 404 index.php?id=567

    对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题

    网站性能优化 提高网站访问速度的14条实践规则

    具体参考:提高网站性能的14条法则:http://www.629d.com/a/200907/62.html

    主要:

    第一条、尽可能的减少 HTTP 的请求数 (Make Fewer HTTP Requests )
    第二条、使用CDN(内容分发网络): Use a Content Delivery Network
    第三条、 添加Expire/Cache-Control 头:Add an Expires Header
    第五条、将css放在页面最上面 ( Put Stylesheets at the Top)
    第六条、将script放在页面最下面 (Put Scripts at the Bottom )


    Tag:php tips
  • 2009-08-20

    php的调试工具XHProf的安装,运用 - [php]

    分了台新服务器做测试,最近很闲,正好拿来练手,哈哈,先拿XHProf玩吧。调试PHP时,XDebug一直是大众的不二选择,搭配上Webgrind,可以获得不错的效果,但是很耗资源,CPU一会就到100%了。最近看别人的blog,发现了XHProf,于是想体验了一下。安装过程很简单,但也遇到不少挫折,因为新服务器,上面有些东西是运维装好了,所以没有仔细了解。都是些小问题,不过折腾死了。

    1.#wget http://pecl.php.net/get/xhprof-0.9.2.tgz  一开始wget用不了,报错:Resolving dada... failed: Temporary failure in name resolution.查明是DNS解析的原因,然后更改 /etc/resolv.conf,问运维,写上正确的IP。

    2.下载完了,解压 #tar zxf xhprof-0.9.2.tgz  然后,#cd cd xhprof-0.9.2/extension/

    3.然后 #phpize   (一般编译安装的PHP都有,没有去下)

    4.#./configure --with-php-config=/usr/bin/php-config

    5.#make    #make install  #make test    就搞定了

    6.然后  更改php.ini  把下面的加到文件中

    [xhprof]
    extension=xhprof.so
    ;
    ; directory used by default implementation of the iXHProfRuns
    ; interface (namely, the XHProfRuns_Default class) for storing
    ; XHProf runs.
    ;xhprof.output_dir=<这里写你要保存xhp生成log的目录>

    7.搞定啦!!  整个过程最郁闷的是,php.ini中的extend扩展地址没写,还是默认的“./”一直没发现,试了半天都不成功,崩溃了,最后还是抽了根烟才发现,呵呵,烟是好东西啊。

    测试下,

    <?php
    function bar($x) {
      if ($x > 0) {
        bar($x - 1);
      }
    }
    function foo() {
      for ($idx = 0; $idx < 2; $idx++) {
        bar($idx);
        $x = strlen("abc");
      }
    }
    // start profiling
    xhprof_enable();
    // run program
    foo();
    // stop profiler
    $xhprof_data = xhprof_disable();
    // display raw xhprof data for the profiler run
    print_r($xhprof_data);

    ?> 


    最后返回数组,就表示安装好了。具体哪些值是什么意思先别管,因为下面有UI的配置。会很直观!

    8.首先,为了好看,装个Graphviz:
    wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
    tar zxf graphviz-2.24.0.tar.gz
    cd graphviz-2.24.0
    ./configure
    make
    make install

    安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。

    9.把上面的测试代码拿过来改改,在最后面,加上几行:

    include_once ("/Data/web/changyou/xhprof_lib/utils/xhprof_lib.php");
    include_once ("/Data/web/changyou/xhprof_lib/utils/xhprof_runs.php");
    $xhprof_runs = new XHProfRuns_Default();
    // Save the run under a namespace "xhprof_foo".
    // **NOTE**:
    // By default save_run() will automatically generate a unique
    // run id for you. [You can override that behavior by passing
    // a run id (optional arg) to the save_run() method instead.]
    //
    $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

    echo "<br>---------------<br>".
    "Assuming you have set up the http based UI for <br>".
    "XHProf at some address, you can view run at <br>".
    "http://192.168.5.148/changyou/xhprof_html/index.php?run=$run_id&source=xhprof_foo<br>".
    "---------------<br>";

    ?>

    然后,好了,运行那个打印出来的URL,OK啦!看看效果,如果你安装了Graphviz,还会有华丽的大图噢


    Tag:php linux
  • 2009-08-13

    中文分词,应用 - [php]

    1.什么是中文分词,以及一些开源项目,见:http://www.williamlong.info/archives/1839.html

    2.中文分词一般在搜索的时候用得较多,分词系统一般是基于词频的,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。

    3.公司现有2个分词系统(开源)
    一个是:SCWS(强大,有PHP接口),开发者:Hightman
    一个是:HJ_SegWord(超轻量,用PHP写的)。

    4.先说Segword,引用类:HJ_SegWord_Class.php,实例化后调用接口:Seg_Word_NM

            include_once('HJ_SegWord_Class.php');
            $HJ_SegWord = new HJ_Segword_Class();
            $keyword = implode(' ', $HJ_SegWord->Seg_Word_NM($keyword));
            $HJ_SegWord->Clear();
            $keyword = empty($keyword) ? $keyword : conutf8($keyword);
            return $keyword;

    5.至于SCWS,安装见官方文档,使用呢:

            $dict = 'lib/pscws/dict/dict.xdb'; //词典
            $version = 3;        // 采用版本
            $autodis = true;    // 是否识别名字
            $ignore  = true;    // 是否忽略标点
            $debug   = false;    // 是否为除错模式
            $stats     = false;    // 是否查看统计结果

            $object = 'PSCWS' . $version;
            require_once('lib/pscws/pscws3.class.php');
            $cws = new $object($dict);
            $cws->set_ignore_mark($ignore); // 是否忽略标点
            $cws->set_autodis($autodis);// 是否识别名字
            $cws->set_debug($debug); // 是否为除错模式
            // 开启统计
            $cws->set_statistics($stats);// 是否查看统计结果    
            $keyword = implode(' ', $cws->segment($keyword, 'words_cb'));
            $keyword = empty($keyword) ? $keyword : conutf8($keyword);

            return $keyword;

  • 2009-08-13

    PHP Tips,留着以后备用(3) - [php]

    //取函数后缀名
    <?php

    $file_name = "course_notice.mp3.rar"; //名字是随便起的
    $extend = explode(".",$file_name);
    $extend_id = count($extend)-1;
    $extend_name = $extend[$extend_id];
    echo($extend_name);
    ?>
     
    <?php
    $file_name = "course_notice.mp3.rar";
    $pt = strrpos($file_name,".")+1;
    $extend_name = substr($file_name,$pt);
    echo($extend_name);
    ?>
     
    <?php
    $file_name = "course_notice.mp3.rar";
    $extend_name = substr(strrchr($file_name,"."),1);
    echo($extend_name);
    ?>
     
    <?php
    $file_name = "course_notice.mp3.rar";
    $extend = pathinfo($file_name);
    $extend_name = $extend['extension'];
    echo($extend_name);
    ?>
    Tag:php
  • 2009-08-12

    curl函数库,应用说明 - [php]

    最近遇到一个需求,后台DBA给了我一个接口调用,在浏览器上用,半秒就出来了,可是在程序里用下面的方法调用,耗时10-19秒:  

       $get = "http://221.123.176.20:8080/userid=".$userid;
       $rank = @file_get_contents($get);
       return $rank;  

    很不靠谱。于是想到curl。

    使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。无论 是你想从从一个链接上取部分数据或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。

    1.安装:用phpinfo()查看是否有安装。如没有,win下修改php.ini,linux下则需重新编译PHP。

    2.取URL:
            // 初始化一个 cURL 对象
            $curl = curl_init();
            // 设置你需要抓取的URL
            $url_info = "http://221.123.176.20:8080/userid=".$gb_userid;
            curl_setopt($curl,CURLOPT_URL,"$url_info");
            // 设置header
            curl_setopt($curl, CURLOPT_HEADER, false);
            // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            $data = curl_exec($curl);
            // 关闭URL请求
            curl_close($curl);
            // 显示获得的数据
            var_dump($data);

    Tag:php
  • 2009-04-28

    基于OpenCV的PHP图像人脸识别技术 - [php]

    [转]基于OpenCV的PHP图像人脸识别技术

     

     

    本文所介绍的技术不是原创,而是从一个叫Robert Eisele的德国人那里学习来的。他写了一个PHP扩展openCV,只封装了两个函数,叫face_detect和face_count。 openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全。本文重点是介绍如何使用php来调用其中的局部的功能。人脸侦 查技术只是openCV一个应用分支。

    1.安装
    从源代码编译成一个动态的so文件。

    1.1.安装 OpenCV (OpenCV 1.0.0)
    下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948

    #tar xvzf OpenCV-1.0.0.tar.gz
    #cd opencv-1.0.0
    #./configure
    #make
    #make install
    #make check (检查是否安装全部正确)

    提示: 不要指定安装路径,否则后面编译facedetect会找不到OpenCV的路径。


    1.2 安装facedetect
    下载地址http://www.xarg.org/download/facedetect-1.0.0.tar.gz

    #tar xzvf facedetect-1.0.0.tar.gz
    #cd facedetect-1.0.0
    #phpize && ./configure && make && make install


    编译完之后会提示facedetect.so 文件所在的位置。

    最后确认在php.ini加入
    extension=facedetect.so,重启apache.

    2.函数使用
    在phpinfo()里检查是否有facedetect这个模块。
    从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下

    1. //检查有多少个脸型
    2. var_dump(face_count('party.jpeg', haarcascade_frontalface_alt.xml'));
    3. //返回脸型在图片中的位置参数,多个则返回数组
    4. $arr = face_detect('party.jpeg', haarcascade_frontalface_alt2.xml');
    5. print_r($arr);



    3.应用
    结合imagick可以将图片做一下应用。因为 face_detect只返回一个矩形参数,包含x,y坐标和w,h长宽参数。下面是我的一个应用demo

    1. <?php
    2. if($_FILES){
    3. $img = $_FILES['pic']['tmp_name'];
    4. $arr = face_detect($img'haarcascade_frontalface_alt2.xml');
    5. //$arr1 = face_detect($img, 'haarcascade_frontalface_alt_tree.xml');
    6. if(is_array($arr1)) $all =array_merge($arr,$arr1);
    7. else $all = $arr;
    8. $im = new Imagick($img);
    9. //$draw =new ImagickDraw();
    10. //$borderColor = new ImagickPixel('red');
    11. //$draw->setFillAlpha(0.0);
    12. //$draw->setStrokeColor  ($borderColor);
    13. //$draw->setStrokeWidth  (1);
    14. if(is_array($all)){
    15.   foreach ($all as $v){
    16.     $im_cl = $im->clone();
    17.     $im_cl->cropImage($v['w'],$v['h'],$v['x'],$v['y']);
    18.     
    19.     $im_cl->swirlImage(60);
    20.     $im->compositeImage( $im_cl, Imagick::COMPOSITE_OVER , $v['x'], $v['y'] );
    21.     
    22.     //$draw->rectangle($v['x'],$v['y'],$v['x']+$v['w'],$v['y']+$v['h']);
    23.     //$im->drawimage($draw);
    24.     
    25.     
    26.   }
    27. }
    28.   header( "Content-Type: image/png" );
    29.   echo $im;
    30. }else{
    31.   ?>
    32.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    33.   <form method="POST" enctype="multipart/form-data">
    34.   人脸识别试验:只支持jpg,png<br>
    35.   上传一张图片 <input type="file" name="pic">
    36.   <input type="submit" value="upload">
    37.   </form>
    38.   <?
    39. }
    40. ?>






    参考资料:
    http://www.xarg.org/2008/07/face-detection-with-php/
    http://www.opencv.org.cn/index.php/首页
    http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html

     

     

     

    以上文章来源:http://blog.csdn.net/zhongmao/archive/2009/01/11/3753377.aspx

     

     

     

     

     

     

     

    使用测试

     

     

    安装测试了一下,如果越是高清的大图,效果越明显,感觉不错

    一 安装
    1 安装opencv
    http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948
    下载opencv-1.1pre1.tar.gz(1.0版本没有安装成功)
    #tar zxvf opencv-1.1pre1.tar.gz
    # cd opencv-1.1.0/
    # /.configure
    #make
    #make install

    2 安装facedetect
    #wget http://www.xarg.org/download/facedetect-1.0.0.tar.gz
    #tar xzvf facedetect-1.0.0.tar.gz
    #cd facedetect-1.0.0
    #/usr/local/php/bin/phpize
    #./configure –with-php-config=/usr/local/php/bin/php-config
    #make
    #make install

    #vi /usr/local/php/etc/php.ini
    // 增加extension=facedetect.so

    3 重启web服务器,在phpinfo()里查看是否有facedetect这个模块

     

    二 简单测试
    从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下

    //检查有多少个脸型
    var_dump(face_count(’test.jpg’, ‘haarcascade_frontalface_alt.xml’));

    //返回脸型在图片中的位置参数,多个则返回数组
    $arr = face_detect(’test.jpg’, ‘haarcascade_frontalface_alt2.xml’);

    print_r($arr);

     

    三 测试代码
    <?
    if(empty($_POST)) {
    ?>
    <form name=”form” id=”form” method=”POST” enctype=”multipart/form-data” action=”">
    上传图片:<input type=”file” name=”pic” size=”20″><input type=”submit” name=”submit” value=”上传”>
    </form>
    <?
    } else {
    $img = $_FILES['pic']['tmp_name'];

    $arr = face_detect($img, ‘haarcascade_frontalface_alt2.xml’);

    if(is_array($arr1)) {
    $all = array_merge($arr,$arr1);
    } else {
    $all = $arr;
    }
    $allowtype = 1;
    switch($_FILES['pic']['type']){
    case ‘image/pjpeg’: $fix_pic.= “.jpg”; break;
    case ‘image/jpeg’: $fix_pic.= “.jpg”; break;
    case ‘image/x-png’: $fix_pic.= “.png”; break;
    case ‘image/png’: $fix_pic.= “.png”; break;
    default: $allowtype = 0; break;
    }

    if($allowtype == 0) {
    echo “文件格式错误:只运行jpg或png图片”;exit;
    }

    $tmp_name = time();
    $src_pic = “/usr/website/nginx/face/haarcascades/upload/”.$tmp_name.$fix_pic;
    move_uploaded_file($_FILES['pic']['tmp_name'], $src_pic);

    $pic_src = $pic_dst = array();
    if(is_array($all)){
    foreach ($all as $k => $v){
    $tmp_name_new = $tmp_name.”_”.$k;
    $x = $v['x'];
    $y = $v['y'];
    $w = $v['w'];
    $h = $v['h'];
    $dst_pic = “/usr/website/nginx/face/haarcascades/upload/”.$tmp_name_new.$fix_pic;
    // echo $src_pic.”<br>”;
    // echo $dst_pic.”<br>”;
    $cmd = “/usr/bin/convert -crop “.$w.”x”.$h.”+”.$x.”+”.$y.” “.$src_pic.” “.$dst_pic;
    // echo $cmd.”<br>”;
    echo `$cmd`;
    $pic_src[] = “upload/”.$tmp_name.$fix_pic;
    $pic_dst[] = “upload/”.$tmp_name_new.$fix_pic;
    }
    }

    foreach($pic_src as $key => $value) {
    echo “<img src=’”.$value.”‘> => <img src=’”.$pic_dst[$key].”‘><br>”;
    }
    }
    ?>

     

     

    以上文章来源:http://www.sysbus.com/?p=124

    Tag:php
  • 2009-04-16

    PHP Tips,留着以后备用(2) - [php]

    //检查数组是否全是空值
    function isEmptyArray($arr) {
    if(is_array($arr)) {
    foreach($arr as $v) {
    if(isEmptyArray($v) == false) {
    return false;
    }
    }
    } else {
    return empty($arr);
    }
    return true;
    }
     
    //判断是否有中文字符
    function isChinese($word) {
    return preg_match ('/[^\x0-\x7F]/', $word);
    }
     
     
    //取出字符串中的url
    $get_url='<a href="http://localhost/member.php?action=login">会员登陆</a>';
    preg_match_all('!<a href=[\"](.+?)[\"]>!is',$get_url,$temp);
    echo $temp[1][0]; //输出 :http://localhost/member.php?action=login
     
     
    //时间戳换成标准时间
    $Unix_time = 967766400;
    $time= date("Y-m-d H:m:s",$Unix_time);
    echo $time; // return 2000-11-1 0:0:0;
     
    //标准时间换成时间戳
    $time = "1 September 2000"; //这里必须是英文的标准时间!!
    $Unix_time = strtotime($time)
    echo $Unix_time; // return 967766400;
     
     
     
     
     
     
    //例子 1. ceil()
    echo ceil(4.3); // 5
    echo ceil(9.999); // 10
    //例子 2. floor()
    echo floor(4.3); // 4
    echo floor(9.999); // 9
    //例子 3. round()
    echo round(3.4); // 3
    echo round(3.5); // 4
    echo round(3.6); // 4
    echo round(3.6, 0); // 4
    echo round(1.95583, 2); // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2); // 5.05
    echo round(5.055, 2); // 5.06
    //例子 4.intval()
    echo intval(4.3); //4
    echo intval(4.6); // 4
    echo intval("undifine"); // 0
     
    /**
    * 将数组转成字符串
    * @param array $array 数组数据
    * @return string strnig。 以 “|” 分割的字符串
    */

    function _array2string($array)
    {
    if (!is_array($array))
    {
    echo "array is exist";
    }
    $string = '';
    foreach($array as $k =>$v)
    {
    $string .= $v.'|';
    }
    if (strlen($string) > 0)
    {
    $string = substr($string,0,-1 );//去掉多增加的标志符
    }
    return $string;
    }
     
    /**
    * 将字符串转成数组
    * @param string $string 以‘|’分隔的字符串
    * @return array $array 数组数据
    */

    function _string2array($string)
    {
    $array = array();
    if (!empty($string))
    {
    $array = preg_split ('/\|/' ,$string);
    }
    return $array;
    }
    Tag:php
  • 2009-03-02

    PHP Tips,留着以后备用(1) - [php]

    <?php
    //中文字符截取 1
    $text = "牛逼牛逼牛逼的牛牛逼的逼哈哈哈";
    $value = substr($text, 0, 18);
    $value_length = strlen($value);
    $value_count = 0;
    for ($i = 0; $i < $value_length; $i++)
    {
    if (ord($value{$i}) > 127)
    {
    $value_count++;
    }
    }
    if ($value_count % 2 != 0)
    {
    $value = substr($text, 0, $value_length - 1);
    }
    echo $value."<BR>";
     
    //中文字符截取 2
    function cut_str($msg,$cut_size,$charset="UTF-8",$suffix="...")
    {
    if($cut_size<=0) return $msg;
    $i=1;$han=0;$eng=0;
    while ($i <= strlen($msg)) {
    if(ord($msg[($i-1)])>127) {
    $han++;
    if($charset=="UTF-8") {
    $i=$i+3;
    }else{
    $i=$i+2;
    }
    }else{
    $eng++;
    $i=$i+1;
    }
    if(($han+$eng)==$cut_size) {
    if($charset=="UTF-8") {
    $cut_size = $eng + (int)$han*3;
    }else{
    $cut_size = $eng + (int)$han*2;
    }
    break;
    }
    }
    for ($i=0;$i<$cut_size;$i++) {
    $str .=$msg[$i];
    }
    return $str.$suffix;
    }
     
    //取得来访者的IP,包括代理服务器!
     
    function iptype1 ()
    {
    if (getenv("HTTP_CLIENT_IP")) return getenv("HTTP_CLIENT_IP");
    else return "none";
    }
    function iptype2 ()
    {
    if (getenv("HTTP_X_FORWARDED_FOR")) return getenv("HTTP_X_FORWARDED_FOR");
    else return "none";
    }
    function iptype3 ()
    {
    if (getenv("REMOTE_ADDR")) return getenv("REMOTE_ADDR");
    else return "none";
    }
    function ip()
    {
    $ip1 = iptype1();
    $ip2 = iptype2();
    $ip3 = iptype3();
    if (isset($ip1) && $ip1 != "none" && $ip1 != "unknown") {
    return $ip1;
    }
    elseif (isset($ip2) && $ip2 != "none" && $ip2 != "unknown") {
    return $ip2;
    }
    elseif (isset($ip3) && $ip3 != "none" && $ip3 != "unknown") {
    return $ip3;
    }
    else {
    return "none";
    }
    }
    echo ip();
    Tag:php