• 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-25

    分布式服务器,查看各台服务器网页内容 - [service]

    /************************
    * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容
    * 创建时间:2008-12-09
    * 参数说明:
    *    $ip   服务器的IP地址
    *    $host   服务器的host名称
    *    $url   服务器的URL地址(不含域名)
    * 返回值:
    *    获取到的远程网页内容
    *    false   访问远程网页失败
    ************************/
    function HttpVisit($ip, $host, $url)  
    {  
       $fp = fsockopen ($ip, 80);
       if (!$fp)  
       {  
            return $erro=$ip." cant connected!!";  
       }  
       else  
       {  
           $out = "GET {$url} HTTP/1.1\r\n";
           $out .= "Host:{$host}\r\n";  
           $out .= "Connection: close\r\n\r\n";
           fputs ($fp, $out);  
           while($line = fread($fp, 4096))
           {
              $response .= $line;
           }
           fclose( $fp );

           //去掉Header头信息
           $pos = strpos($response, "\r\n\r\n");
           $response = substr($response, $pos + 4);
       
           return $response;  
       }  
    }
    //调用方法:
    $server_info1 = HttpVisit("60.28.209.250", "my.molihe.com", "index.php");
    $server_info2 = HttpVisit("60.28.209.245", "my.molihe.com", "index.php");
    $server_info3 = HttpVisit("60.28.209.221", "my.molihe.com", "index.php");
    ?>

    Tag:php linux
  • 2009-04-24

    小网站的框架设计要考虑的东西 - [knowledge]

    别人的东西,拿来总结下,自己留着看!

    架构层次清晰化
    起步的阶段应该清楚的确定下来架构的层次。如果都搅和在一起,业务一旦扩增开来,如果原有的一堆东西拆不开就是非常痛苦的事情。
    Web Server <--> (AppServer)<-->Cache(eg. Memcached)<-->DB

    前端优化很重要
    因为流量低,访客可能也不多,这时候值得注意的是页面不要太大,多数流量低的站点吃亏就在于一个页面动辄几兆(我前两天看到一个Startup的首页有4M之大,可谓惊人),用户看个页面半分钟都打不开,你说咋发展? 先把基本的条件满足,再去研究前端优化。

    从开始考虑性能
    这一点是可选的,但也重要。设计应用的时候在开始就应考虑 Profile 这件事情。一套应用能否在后期进行有效优化和扩展,很大的程度限制在是否有比较合适的 Profile 机制上。需要补充的是,对性能的考虑必然要把有关的历史数据考虑进来。

    好架构不是设计出来的
    这是最后要补充的一点。好的架构和最初的设计有关系,但最重要的是发展中的演化:
    发展-->发现问题-->反馈-->解决问题(执行力)--> 改进->进化到下一阶段--新问题出现(循环)

    Tag:knowledge
  • 2009-04-22

    [linux服务器] 监控系统的平均负载 - [linux]

    为什么要监控系统的平均负载?
         有时我们会感觉到系统响应很慢,但是又找不到原因,这时要查平均负载,是否有大量的进程在排队等待  
    1,平均负载是什么?
               特定时间间隔内运行队列中的平均进程数,好象还不够明白:就是进程队列的长度,有多少个进程在排队等待运行
    2,什么是"进程队列"?
               一个进程满足以下条件就会位于进程队列中
                      1,它没有在等待I/O操作的结果
                      2,它没有主动进入等待状态(即没有调用wait)
                      3,它没有被停止
    3,如何查看平均负载?
      最简单的命令是uptime
      例子:
      [lhd@localhost ~]$ uptime
      00:44:22 up  1:17,  3 users,  load average: 8.13, 5.90, 4,94
    4,显示的内容是什么意思?
              load average:    8.13,5.90,4,94
              显示的是过去的1,5,15分钟内进程队列中的平均进程数量
    5,如何衡量当前系统是否负载过高?
            如果每个cpu(可以按CPU核心的数量计算)上当前活动进程数不大于3,则系统性能良好,
            不大于4,表示可以接受
            如大于5,则系统性能问题严重
            上面例中的8.13,如果有2个cpu核心,则8.13/2=4.065,   此系统性能可以接受
            建议设置严格的报警值为: CPU核心的数量
            比如:CPU核心数量为2,则设置报警值为2
            (这样设置是合理的,因为毕竟不是每个应用都支持多CPU及多核心)
    6,查看平均负载的命令
                     有5个可用:
                     tload    能够绘制出负载变化的图形
                     uptime   同时显示开机以来的时间
                     w        同时显示出已登录的用户
                     top      这个对资源占用太高,不建议使用
                     cat /proc/loadavg   通过/proc系统信息得到平均负载
    注意:如果你要持续的观察平均负载,建议用 watch uptime  或 watch cat /proc/loadavg
    备注:关于watch:每隔一定时间执行指定的程序,并全屏显示结果。时间默认是2秒

    --------------------------------------------------------------------

    uptime

    这个uptime外壳命令产生下列输出:

    [pax:~]% uptime
    9:40am up 9 days, 10:36, 4 users, load average: 0.02, 0.01, 0.00

    它显示自从上次系统重启以来,活动的用户进程数量和所谓的平均负荷指标(load average)。

    procinfo

    在Linux系统上,procinfo命令产生以下输出:

    [pax:~]% procinfo
    Linux 2.0.36 (root@pax) (gcc 2.7.2.3) #1 Wed Jul 25 21:40:16 EST 2001 [pax]

    Memory: Total Used Free Shared Buffers Cached
    Mem: 95564 90252 5312 31412 33104 26412
    Swap: 68508 0 68508

    Bootup: Sun Jul 21 15:21:15 2002 Load average: 0.15 0.03 0.01 2/58 8557
    ...

    平均负载指标出现在这个输出的左下角。

    w

    w(ho)命令产生下列输出:

     [pax:~]% w
      9:40am  up 9 days, 10:35,  4 users,  load average: 0.02, 0.01, 0.00
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    mir ttyp0 :0.0 Fri10pm 3days 0.09s 0.09s bash
    neil ttyp2 12-35-86-1.ea.co 9:40am 0.00s 0.29s 0.15s w
    ...

    请注意,第一行的输出与uptime命令的输出相同。

    top

    top命令是最近加入到UNIX命令集中的,它通过计算进程消耗CPU的时间来给进程排名。它产生下列输出:

      4:09am  up 12:48,  1 user,  load average: 0.02, 0.27, 0.17
    58 processes: 57 sleeping, 1 running, 0 zombie, 0 stopped
    CPU states: 0.5% user, 0.9% system, 0.0% nice, 98.5% idle
    Mem: 95564K av, 78704K used, 16860K free, 32836K shrd, 40132K buff
    Swap: 68508K av, 0K used, 68508K free 14508K cched

    PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND
    5909 neil 13 0 720 720 552 R 0 1.5 0.7 0:01 top
    1 root 0 0 396 396 328 S 0 0.0 0.4 0:02 init
    2 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kflushd
    3 root -12 -12 0 0 0 SW< 0 0.0 0.0 0:00 kswapd
    ...

    所有这些命令,请注意,输出中都有三个数字报告平均负载。相当普遍的是,这些数字显示出从左至右的降序但是有时,又是升序排列,正如上面的输出。

    Tag:linux
  • 2009-04-17

    mysql数据库的优化(入门) - [mysql]

    碰到过好几次这样的Mysql题目,可每次都不能答的完全正确.

    现在大概列出如下:
    1.数据库的设计
    尽量把数据库设计的更小的占磁盘空间.
    1).尽可能使用更小的整数类型.(mediumint就比int更合适).
    2).尽可能的定义字段为not null,除非这个字段需要null.
    3).如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char.
    4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.
    5).只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的压缩。
    6).所有数据都得在保存到数据库前进行处理。
    7).所有字段都得有默认值。
    8).在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取得相关记录时,它可能使用更小的静态格式表的情况下更是如此。

    2.系统的用途
    1).尽量使用长连接.
    2).explain 复杂的SQL语句。
    3).如果两个关联表要做比较话,做比较的字段必须类型和长度都一致.
    4).LIMIT语句尽量要跟order by或者 distinct.这样可以避免做一次full table scan.
    5).如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename.
    6).能使用STORE PROCEDURE 或者 USER FUNCTION的时候.
    7).在一条insert语句中采用多重纪录插入格式.而且使用load data infile来导入大量数据,这比单纯的indert快好多.
    8).经常OPTIMIZE TABLE 来整理碎片.
    9).还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。

    3.系统的瓶颈

    1).磁盘搜索.
    并行搜索,把数据分开存放到多个磁盘中,这样能加快搜索时间.
    2).磁盘读写(IO)
    可以从多个媒介中并行的读取数据。
    3).CPU周期
    数据存放在主内存中.这样就得增加CPU的个数来处理这些数据。
    4).内存带宽
    当CPU要将更多的数据存放到CPU的缓存中来的话,内存的带宽就成了瓶颈.
    ---------------------------------------------------------------------------------------
    在整体的系统运行过程中,数据库服务器 MySQL 的压力是最大的,不仅占用很多的内存和 cpu 资源,而且占用着大部分的磁盘 io 资源,连 PHP 的官方都在声称,说 PHP 脚本 80% 的时间都在等待 MySQL 查询返回的结果。由此可见,提高系统的负载能力,降低 MySQL 的资源消耗迫在眉睫。

    1、页面缓存功能:

    页面缓存功能降低MySQL的资源消耗的(系统本身就已经考虑,采用生成HTML页面,大大降低了数据库的压力)。
    2、mysql服务器的优化

      2.1、修改全站搜索
        修改my.ini(my.cnf) ,在 [mysqld] 后面加入一行“ft_min_word_len=1”,然后重启Mysql,再登录网站后台(模块管理->全站搜索)重建全文索引。
      2.2、记录慢查询sql语句,修改my.ini(my.cnf),添加如下代码:
        #log-slow-queries
        long_query_time = 1 #是指执行超过多久的 sql 会被 log 下来
        log-slow-queries = E:/wamp/logs/slow.log #设置把日志写在那里,可以为空,系统会给一个缺省的文件
        #log-slow-queries = /var/youpath/slow.log linux下     host_name-slow.log
        log-queries-not-using-indexes
      2.3、mysql缓存的设置
       mysql>show variables like '%query_cache%';     mysql本身是有对sql语句缓存的机制的,合理设置我们的mysql缓存可以降低数据库的io资源。
        #query_cache_type= 查询缓存的方式(默认是 ON)
        query_cache_size 如果你希望禁用查询缓存,设置 query_cache_size=0。禁用了查询缓存,将没有明显的开销
        query_cache_limit 不缓存大于这个值的结果。(缺省为 1M)
       2.4、查询缓存的统计信息
       mysql> SHOW STATUS LIKE ‘qcache%’;
         Qcache_free_blocks 缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE 会对缓存中的碎片进行整理,从而得到一个空闲块。
        Qcache_free_memory 缓存中的空闲内存。
        Qcache_hits 每次查询在缓存中命中时就增大。
        Qcache_inserts 每次插入一个查询时就增大。命中次数除以插入次数就是不中比率;用 1 减去这个值就是命中率。在上面这个例子中,大约有 87% 的查询都在缓存中命中。
        Qcache_lowmem_prunes 缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks 和 free_memory 可以告诉您属于哪种情况)。
        Qcache_not_cached 不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句。
        Qcache_queries_in_cache 当前缓存的查询(和响应)的数量。
        Qcache_total_blocks 缓存中块的数量。通常,间隔几秒显示这些变量就可以看出区别,这可以帮助确定缓存是否正在有效地使用。运行 FLUSH STATUS 可以重置一些计数器,如果服务器已经运行了一段时间,这会非常有帮助。
       2.5、my.ini(my.conf)配置
        2.5.1、key_buffer_size = 256M
        # key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。     对于内存在4GB左右的服务器该参数可设置为256M或384M。注意:该参数值设置的过大反而会是服务器整体效率降低!
        2.5.2、
        max_allowed_packet = 4M
        thread_stack = 256K
        table_cache = 128K
        sort_buffer_size = 6M
        查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。
        2.5.3、
        read_buffer_size = 4M
        读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享!
        2.5.4、join_buffer_size = 8M
        联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享!
        2.5.5、
        myisam_sort_buffer_size = 64M
        table_cache = 512
        thread_cache_size = 64
        query_cache_size = 64M
        指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察:
        # > SHOW VARIABLES LIKE '%query_cache%';
        # > SHOW STATUS LIKE 'Qcache%';
        # 如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;
        #如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;
        Qcache_free_blocks,如 果该值非常大,则表明缓冲区中碎片很多
        2.5.6、
        tmp_table_size = 256M
         max_connections = 768
        指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提示,则需要增大该参数值。
        2.5.7、
        max_connect_errors = 10000000
        wait_timeout = 10
        指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
        2.5.8、
        thread_concurrency = 8
        该参数取值为服务器逻辑CPU数量×2,如果服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 = 8
         2.5.9、
        skip-networking
        开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!

    Tag:Mysql
  • 2009-04-17

    mysql对两个表的操作 - [mysql]

    A。最近用到把一个表的数据重新按主键唯一建立,最简单的方法是

    create   table   tmp   as   select   *   from   youtable   group   by   name;

    然后删除不同的表,重命名tmp,因为group   by,所以可以唯一,呵呵

    B。将一个表的其中一个字段导入数据导另一个表内

    1. INSERT INTO SELECT语句
    语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

    2.SELECT INTO FROM语句
    语句形式为:SELECT vale1, value2 into Table2 from Table1
    要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中

    3.Select * from table 1 where ID not in (Select ID from table2)

    其实,也可作为表的备份,来看!!!!

    Tag:Mysql
  • 2009-04-16

    总结 - [knowledge]

    1.产品:任何产品的设计,必须考虑SEO的规划,因为通过SEO获得流量很可观。另外,经济成本,不能因为前期对用户量的要求而大意,产品理念的前卫跟赢利不一定成正比,必须考虑成本,同时也为日后维护提供便捷。

    2.团队:1>.战斗力 2>.明确的分工和不同的能力 3>.满足每位同事的发展方向,不同的空间去延展 4>.凝聚力

    3.面向对象,面向对象的威力应该在于封装和多态,三个特点:封装,继承,多态!

    Tag:knowledge
  • 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-04-11

    linux,gzip, zcat,tar命令 - [linux]

    在test目录下,有test.log文件,想要压缩

    ---------------.gz 文档!-------------------

    #gzip test.log       (会生成一个test.log.gz文档)
    (但是原test.log就没拉,如果想保留原文件,就直接:#gzip test.log >test.log.gz )
    #gzip -d test.log.gz   (解压)

    zcat 查看.gz文档的内容
    #zcat test.log.gz

    ------------------bz2文档!------------------

    #bzip2 test.log       (会生成一个test.log.bz2文档)
    (但是原test.log就没拉,如果想保留原文件,就直接:#bzip2 test.log >test.log.bz2 )
    #bzip2 -d test.log.bz2   (解压)

    bzcat 查看.bz2文档的内容
    #bzcat test.log.bz2

    --------------------tar 打包!-----------------

    tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:
    # tar -cf test.log.tar *.log
    这条命令是将所有.log的文件打成一个名为test.log.tar的包。-c是表示产生新的包,-f指定包的文件名。
    # tar -rf test.log.tar *.log2
    这条命令是将所有.log2的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
    # tar -uf test.log.tar test.log
    这条命令是更新原来tartest.log.tartest.log文件,-u是表示更新文件的意思。

    # tar -tf test.log.tar
    这条命令是列出all.tar包中所有文件,-t是列出文件的意思
    # tar -xf test.log.tar
    这条命令是解出test.log.tar包中所有文件,-x是解开的意思

    ------------------tar调用gzip、bzip2------------------

    -z 调用gzip
    # tar -czf test.log.gz.tar *.log
    这条命令是将所有.log的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,
    # tar -xzf test.log.gztar
    这条命令是将上面产生的包解开。

    -j 调用bzip2
    # tar -cjf test.log.bz2.tar *.log
    这条命令是将所有.log的文件打成一个tar包,并且将其用bzip2压缩,
    # tar -xjf test.log.bz2.tar
    这条命令是将上面产生的包解开。

    Tag:linux bash
  • 2009-04-08

    mysql中查询相同的字段,两种查询!效率差别很大! - [mysql]

    表内数据为2200个!!!!两种方式,效率差别很大!!
    mysql> desc coop_user;
    +-----------+-------------+------+-----+---------+-------+
    | Field          | Type           | Null    | Key | Default   | Extra  |
    +-----------+-------------+------+-----+---------+-------+
    | uid             | int(11)        |         | PRI | 0   
    | email          | varchar(32) |         | MUL |       
    | pass          | varchar(36) |    
    | org_email   | varchar(32) |     
    | org_pass   | varchar(36) |    
    | coop          | varchar(32) |     
    | addtime     | varchar(20) |    
    +-----------+-------------+------+-----+---------+-------+

    用两种方法!!查询coop_user表中,email相同的字段!!

    1>  select * from coop_user where email in (select  email  from  coop_user  group  by  email  having  count(*) > 1);   用时:17s
    此查询,打印出所有相同的字段:有22行!

    2>  select *,count(email) as a from coop_user group by email having a>1 ;  用时0.06S

    此查询,只打印出有所有相同的唯一1个信息:有11行!

    Tag:Mysql
  • 2009-04-01

    JQuery实现<select>onchang事件触发展开一个div - [JQuery]

    PS:标题有点绕,具体意思是:选择了某项,会出现一个input对话框,不选就不出现,引用JQuery文件!

    1.在不引用Jquery时,可以alter所选项的index!其中,option可跟disabled标签

    <select name="ask_sort" onchange="alert(selectedIndex)">
            <option>0</option>
            <option disabled="disabled">-----游戏-----</option>
            <option>2</option>
            <option>3</option>
    </select>

    2.现在根据上面的原理。引用JQuery,如下:

    <script type="text/javascript" src="../js/jquery.js"></script>

    <select name="ask_sort" onchange="$('#gamenick').css('display', selectedIndex==0?'none':'')">
            <option>0</option>
            <option disabled="disabled">-----游戏-----</option>
            <option>2</option>
            <option>3</option>
            </select>
    <div class="cF Fdiv" id="gamenick" style="display:none">
        <input name="ask_nick" type="text" />
    </div>

    用JS控制css的desplay就好了,

    Tag:JS css