分类目录归档:图片/文字

国内一优秀免费防火墙今天发布了新版(离上一版有一年多时间)

『风云防火墙个人版 2009』

官方网站:

http://www.218.cc/

 

以前电脑的安全软件是

免费的风云防火墙1.27 + 免费的小红伞v8

正好小红伞昨天完成版本的更新v9 今天风云防火墙经过一年多的测试也发布了2009正式版

电脑现在的安全软件是

免费的风云防火墙2009+ 免费的小红伞v9

二款相互配合,非常好用,同时两款软件也非常的节省资源 让电脑处于全面保护状态

小红伞免费版9.0版本正式发布

前天刚在blog里发布小红伞晓月汉化v8免费版的信息,今天一大早就发布v9正式版出了来,小兴奋了一把,下载后换掉了v8,还在试用中。

Avira AntiVir 个人版- Free版,P版(Premium)和S版(Premium Suit)的所拥有的改进如下:
隔离区管理:列数减少
隔离区管理:可以使用HTTP上报文件
系统托盘工具:鼠标悬停时显示各个监控的状态
最后系统扫描:可在设定中独立配置警告信息
在设定面板中将“Win32 Heuristic”重命名为“AHeAD”
支持上网本(屏幕分辨率)
设定面板:新增按钮“Default Values(默认值)” 。这个按钮可以让您的配置恢复到预先确定的默认值
所有产品的安装文件夹路径和注册表项都改为“C:\Program Files\Avira\AntiVir Desktop”和“HKLM\Software\Avira\AntiVir Desktop”.现在个人版的各个版本不再有任何区别(指文件夹和注册表路径)
新增安装后的配置向导
GUI进程的保护
文件和文件夹保护
Avira键值的注册表保护
扫描锁定的档案
扫描器:手动扫描后对病毒检出结果的综合显示和一键清除。这个选项可以设置在扫描仪的配置
扫描器:改进后的清毒系统
扫描器:多核机器上的优化扫描
监控:更少内存占用
计划任务:现在可以在一个星期的多天内启动计划任务
计划任务:手动启动和停止任务
Avira AntiVir Personal – Free Antivirus独有改进如下:
增加对广告和间谍程序的检测查杀

小红伞v9 免费版官方站

http://www.free-av.com/

在linux下聊qq

vps上聊qq 

用它来挂qq了。每天凌晨挂两个小时,嘿嘿

以前也挂过,用的是2.8版的,今天看到了个新版的,放上去试试,还好没出现要输入验证码

下载的包里有编译好了的linux版和windows版 当然也有源码

1.jpg

 

2.jpg

 

myqq 2.9最新版下载

 

myqq2.9.zip

一个mysql数据库访问类,带简单的数据缓存功能

本数据访问类是之前自己写的一个框架里的,修改了一下,所以先放在博客里

下载:

db.rar

主要几个功能

第一个是数据统计
count($table,$where=”,$order=”,$group=”);

第二个是查找第一条数据
find($table,$where=”,$field=’*’,$order=”,$limit=”,$group=”)

第三个是查找一组数据
findAll($table,$where=”,$field=’*’,$order=”,$limit=”,$group=”)

第四个是全文件检索,需mysql类型的词库一份,本博里有,如有需要请在博客里搜索全文检索
fullText($table,$key,$str,$where=”,$field=’*’,$limit=”,$group=”)

第五个是数据的缓存,目前只支持find findAll两种方法
dbCache($time,$func,$table,$where=”,$field=’*’,$order=”,$limit=”,$group=”)

第六个是插入数据,只需指定表名和要插入的数组即可,可以直接用$_POST 会自动寻找与表字段相匹配的数据进入插入,插入的数据自己做防注入处理
insert($table,$data)

第七个是删除数据,只需指定表名和主键,或用数组方式指出删除条件
delete($table,$keyarr)

第八个是更新数据,指定表名,数据,主键或是数组形式的更新条件
update($table,$data, $keyarr)

 

db.class.php

PHP代码
  1. <?php  
  2. /* 
  3. #  数据模型 
  4. #  PDO方式访问Mysql数据库,主要方法:利数组方式快速插入(insert) 利用数组做连表查询(findAll find) 
  5. #  作者:℃冻番茄 qq:7279915 
  6. #  web@ye55.com  www.ye55.com (蓝叶工作室) 
  7. */  
  8.   
  9. class db{  
  10.   
  11.     public $db;  
  12.     public $queryNum=0;  
  13.     public $querySql=array();  
  14.     public $error;  
  15.     public $cacheNum=0;  
  16.   
  17.     function __construct()  
  18.     {  
  19.         if(!$this->db= @new PDO(conf(‘dbType’).‘:host=’.conf(‘dbHost’).‘;dbname=’.conf(‘dbName’), conf(‘dbUser’), conf(‘dbPass’))){  
  20.             $this->error=‘数据库连接信息出错!’;  
  21.         }  
  22.         $this->db->exec(‘SET NAMES ‘.conf(‘charset’));   
  23.     }  
  24.   
  25.     function query($sql)  
  26.     {  
  27.         $rs = $this->db->query($sql);  
  28.         $this->queryNum++;  
  29.         $this->querySql[]=$sql;  
  30.         return $rs;  
  31.     }  
  32.   
  33.   
  34.     function beginTransaction()  
  35.     {  
  36.         return $this->db->beginTransaction();  
  37.     }  
  38.   
  39.     function commit()  
  40.     {  
  41.         return $this->db->commit();  
  42.     }  
  43.   
  44.     function rollBack()  
  45.     {  
  46.         return $this->db->rollBack();  
  47.     }  
  48.   
  49.     function exec($sql)  
  50.     {  
  51.         $this->queryNum++;  
  52.         $this->querySql[]=$sql;  
  53.         return $this->db->exec($sql);  
  54.     }  
  55.   
  56.     function lastInsertId()  
  57.     {  
  58.         return $this->db->lastInsertId();  
  59.     }  
  60.   
  61.   
  62.     function setAttribute($attr$value)  
  63.     {  
  64.         return $this->db->setAttribute($attr$value);  
  65.     }  
  66.   
  67.   
  68.     function insert($table,$data)  
  69.     {  
  70.         $table=conf(‘dbprefix’).$table;  
  71.         $fields = "";  
  72.         $values = "";  
  73.         $tableCache=$this->tableCache($table);  
  74.         $tableCache=$tableCache[$table];  
  75.         foreach($data as $field=>$value)  
  76.         {  
  77.             if(in_array($field,$tableCache[‘field’])){  
  78.                 $fields .= "`$field`, ";  
  79.                 $values .= "’".mysql_escape_string($value)."’, ";  
  80.             }  
  81.         }  
  82.           
  83.         $fields = substr_replace($fields"", -2, 1);  
  84.         $values = substr_replace($values"", -2, 1);  
  85.   
  86.         $sql = "insert into `$table` ($fields) values ($values)";  
  87.           
  88.         //echo $sql;  
  89.         if($rs = $this->query($sql)){  
  90.             return $this->lastInsertId();  
  91.         }else{  
  92.             $this->error=‘插入数据出错!’;  
  93.             return false;  
  94.         }  
  95.           
  96.     }  
  97.   
  98.     function delete($table,$keyarr){  
  99.         $table=conf(‘dbprefix’).$table;  
  100.         if(is_array($keyarr)){  
  101.             $where = " where ";  
  102.             foreach($keyarr as $key=>$key_value)  
  103.             {  
  104.                 $where .= " `$key`=’".mysql_escape_string($key_value)."’ and";  
  105.             }  
  106.             $where=substr($where,0,-3);  
  107.         }else{  
  108.             $tableCache=$this->tableCache($table);  
  109.             $where =" where `".$tableCache[$table][‘key’]."`=’".mysql_escape_string($keyarr)."’";  
  110.             unset($tableCache);  
  111.         }  
  112.         $sql = "delete from `$table` $where";  
  113.         //echo $sql;  
  114.         if(!$rs =$this->query($sql)){  
  115.             $this->error=‘插入数据出错!’;  
  116.         }  
  117.         return $rs;  
  118.     }  
  119.   
  120.     function update($table,$data$keyarr)  
  121.     {  
  122.         $table=conf(‘dbprefix’).$table;  
  123.         $set = "";  
  124.         $tableCache=$this->tableCache($table);  
  125.         $tableCache=$tableCache[$table];  
  126.         //dump($data);  
  127.         foreach($data as $field=>$value)  
  128.         {  
  129.             if(in_array($field,$tableCache[‘field’])){  
  130.                 $set .= "`$field`=’".mysql_escape_string($value)."’, ";  
  131.             }  
  132.         }  
  133.         $set = substr_replace($set"", -2, 1);  
  134.         if(is_array($keyarr)){  
  135.             $where = " where ";  
  136.             foreach($keyarr as $key=>$key_value)  
  137.             {  
  138.                 $where .= "`$key`=’$key_value’";  
  139.             }  
  140.         }else{  
  141.             $where =" where `".$tableCache[‘key’]."`=’".mysql_escape_string($keyarr)."’";  
  142.         }  
  143.         unset($tableCache);  
  144.         $sql = "update `$table` set $set  $where";  
  145.         //echo $sql;  
  146.         if(!$rs =$this->query($sql)){  
  147.             $this->error=‘更新数据出错!’;  
  148.         }  
  149.           
  150.         return $rs;  
  151.     }  
  152.   
  153.     function find($table,$where=,$field=‘*’,$order=,$limit=,$group=)  
  154.     {  
  155.         $sql=$this->_map($table,$where,$field,$order,$limit,$group);  
  156.           
  157.         return $this->_find($sql);  
  158.     }  
  159.       
  160.     function findAll($table,$where=,$field=‘*’,$order=,$limit=,$group=)  
  161.     {  
  162.         $sql=$this->_map($table,$where,$field,$order,$limit,$group);  
  163.         //echo $sql;  
  164.         return $this->_findAll($sql);  
  165.     }  
  166.       
  167.     function fullText($table,$key,$str,$where=,$field=‘*’,$limit=,$group=)  
  168.     {  
  169.         $order=emptyempty($order)?:‘order by ‘.$order;  
  170.         $limit=emptyempty($limit)?:‘limit ‘.mysql_escape_string($limit);  
  171.         $group=emptyempty($group)?:‘group by ‘.$group;  
  172.         $field=emptyempty($field)?‘*’:$field;  
  173.         $w="where MATCH ($key) against (‘$str’) ".$where;  
  174.           
  175.         if(is_array($table)){  
  176.             $table1=conf(‘dbprefix’).$table[0];  
  177.             //echo $table1;  
  178.             $count=count($table);  
  179.             $joinleft=;  
  180.             array_shift($table);  
  181.             foreach($table as $v){  
  182.                 foreach($v as $k2=>$v2){  
  183.                     $k2=conf(‘dbprefix’).$k2;  
  184.                     foreach($v2 as $k3=>$v3){  
  185.                         $l="$table1.$k3=$k2.$v3";  
  186.                     }  
  187.                     $joinleft.="left join $k2 on $l ";  
  188.                 }  
  189.             }  
  190.             $sql="select $field from $table1 $joinleft $w $order $group $limit";  
  191.         }else{  
  192.             $table=conf(‘dbprefix’).$table;  
  193.             $sql="select $field from $table $w  $order $group $limit";  
  194.         }  
  195.         //echo $sql;  
  196.         $rs=$this->query($sql);  
  197.         $row=$rs->fetchall(PDO::FETCH_ASSOC);  
  198.         return $row;  
  199.     }  
  200.       
  201.     function dbCache($time,$func,$table,$where=,$field=‘*’,$order=,$limit=,$group=)  
  202.     {  
  203.         if($func!=‘find’ && $func!=‘findAll’return false;  
  204.         if(emptyempty($time)){  
  205.             return $this->$func($table,$where,$field,$order,$limit,$group);  
  206.         }  
  207.         $tableStr=is_array($table)?serialize($table):$table;  
  208.         $whereStr=is_array($where)?serialize($where):$where;  
  209.         $file=conf(‘cacheDir’).‘/’.$func.‘.’.md5($tableStr.$whereStr.$field.$order.$limit.$group).‘.php’;  
  210.           
  211.         if(file_exists($file)){  
  212.             if(time()-filemtime($file)<$time){  
  213.                 $content=file_get_contents($file);  
  214.                 $arr=unserialize(substr($content,13));  
  215.                 $this->cacheNum++;  
  216.                 return $arr;  
  217.             }else{  
  218.                 return $this->_dbWriteCache($file,$func,$table,$where,$field,$order,$limit,$group);  
  219.             }  
  220.         }else{  
  221.             return $this->_dbWriteCache($file,$func,$table,$where,$field,$order,$limit,$group);  
  222.         }  
  223.     }  
  224.       
  225.     private function _dbWriteCache($file,$func,$table,$where,$field,$order,$limit,$group)  
  226.     {  
  227.         fclose(fopen($file"w"));  
  228.         $arr=$this->$func($table,$where,$field,$order,$limit,$group);  
  229.         $content=‘<?php exit;?>’.serialize($arr);  
  230.         if(file_put_contents($file,$content)){  
  231.             return $arr;  
  232.         }else{  
  233.             $this->error=‘缓存写入出错!’;  
  234.             return false;  
  235.         }  
  236.     }  
  237.   
  238.     function count($table,$where=,$order=,$group=)  
  239.     {  
  240.         $tableCache=$this->tableCache($table);  
  241.         $tableCache=$tableCache[$table];  
  242.         $sql=$this->_map($table,$where,‘count(‘.conf(‘dbprefix’).$table.‘.’.$tableCache[‘key’].‘)’,$order,,$group);  
  243.         //echo $sql;  
  244.         return $this->_count($sql);  
  245.     }  
  246.       
  247.       
  248.       
  249.     private function _count($sql)  
  250.     {  
  251.         $rs=$this->query($sql);  
  252.         $count=$rs->fetchColumn();  
  253.         $count=emptyempty($count)?0:$count;  
  254.         return $count;  
  255.     }  
  256.       
  257.     private function _find($sql)  
  258.     {  
  259.         $rs=$this->query($sql);  
  260.         $row=$rs->fetch(PDO::FETCH_ASSOC);  
  261.         return $row;  
  262.     }  
  263.       
  264.     private function _findAll($sql)  
  265.     {  
  266.         $rs=$this->query($sql);  
  267.         //echo $sql;  
  268.         $row=$rs->fetchall(PDO::FETCH_ASSOC);  
  269.         return $row;  
  270.     }  
  271.       
  272.   
  273.     /** 
  274.     +———————————————————- 
  275.     * 指定表名,条件,字段,排序,个数等组合sql 
  276.     +———————————————————- 
  277.     * @return string 
  278.     +———————————————————- 
  279.     */    
  280.     private function _map($table,$where=,$field=‘*’,$order=,$limit=,$group=)  
  281.     {  
  282.         $order=emptyempty($order)?:‘order by ‘.$order;  
  283.         $limit=emptyempty($limit)?:‘limit ‘.mysql_escape_string($limit);  
  284.         $group=emptyempty($group)?:‘group by ‘.$group;  
  285.         $field=emptyempty($field)?‘*’:$field;  
  286.         $w=;  
  287.           
  288.         if(!emptyempty($where)){  
  289.             if(is_array($where)){  
  290.                 $w.=‘where’;  
  291.                 foreach($where as $k=>$v){  
  292.                     $w.=" $k=’$v’ and";  
  293.                 }  
  294.                 $w=substr($w,0,strlen($w)-3);  
  295.             }elseif(!preg_match ("/where/i",$where) && !is_array($table)){  
  296.               
  297.                 $tableCache=$this->tableCache($table);  
  298.                 $w=" where `".$tableCache[$table][‘key’]."`=’".mysql_escape_string($where)."’";  
  299.                 unset($tableCache);  
  300.             }else{  
  301.                   
  302.                 $w=$where;  
  303.             }  
  304.         }  
  305.           
  306.         if(is_array($table)){  
  307.             $table1=conf(‘dbprefix’).$table[0];  
  308.             //echo $table1;  
  309.             $count=count($table);  
  310.             $joinleft=;  
  311.             array_shift($table);  
  312.             foreach($table as $v){  
  313.                 foreach($v as $k2=>$v2){  
  314.                     $k2=conf(‘dbprefix’).$k2;  
  315.                     foreach($v2 as $k3=>$v3){  
  316.                         $l="$table1.$k3=$k2.$v3";  
  317.                     }  
  318.                     $joinleft.="left join $k2 on $l ";  
  319.                 }  
  320.             }  
  321.             $sql="select $field from $table1 $joinleft $w $order $group $limit";  
  322.         }else{  
  323.             $table=conf(‘dbprefix’).$table;  
  324.             $sql="select $field from $table $w  $order $group $limit";  
  325.         }  
  326.         //echo $sql;  
  327.         return $sql;  
  328.     }  
  329.       
  330.     /** 
  331.     +———————————————————- 
  332.     * 读取指定表的主键及字段,如缓存文件里不存在指定表的信息,则写入 
  333.     +———————————————————- 
  334.     * @param string $table 表名 
  335.     +———————————————————- 
  336.     * @return array 
  337.     +———————————————————- 
  338.     */  
  339.       
  340.     private function tableCache($table)  
  341.     {  
  342.         $this->tableCacheFile=conf(‘cacheDir’).‘/table.inc.php’;  
  343.       
  344.         if(file_exists($this->tableCacheFile)){  
  345.             $tableCache=@file_get_contents($this->tableCacheFile);  
  346.             $tableCache=unserialize(str_replace(‘<?php exit;?>’,,$tableCache));  
  347.             if(!isset($tableCache[$table])){  
  348.                 $arr=$this->_tableCache($table);  
  349.                 $tableCache=@array_merge($tableCache,$arr);  
  350.                 //dump($tableCache);  
  351.                 if(!$this->_writeTableCache($tableCache)){  
  352.                     $this->error=‘数据表缓存写入出错 TABLE:’.$table;  
  353.                 }  
  354.             }  
  355.         }else{  
  356.             $tableCache=$this->_tableCache($table);  
  357.             if(!$this->_writeTableCache($tableCache)){  
  358.                 $this->error=‘数据表缓存写入出错 TABLE:’.$table;  
  359.             }  
  360.         }  
  361.         //dump($tableCache);  
  362.         return $tableCache;  
  363.     }  
  364.       
  365.     /** 
  366.     +———————————————————- 
  367.     * 通过表名,获取些表的主键及所有字段 
  368.     +———————————————————- 
  369.     * @param string $table 表名 
  370.     +———————————————————- 
  371.     * @return array 
  372.     +———————————————————- 
  373.     */    
  374.     private function _tableCache($table)  
  375.     {  
  376.         $rs=$this->query("describe $table");  
  377.         $row=$rs->fetchall(PDO::FETCH_ASSOC);  
  378.         $tmp=array();  
  379.         foreach($row as $v){  
  380.             //echo $v[‘Field’];  
  381.             if($v[‘Key’]==‘PRI’)$key=$v[‘Field’];  
  382.             $tmp[]=$v[‘Field’];  
  383.         }  
  384.         $cache=array($table=>array(‘key’=>$key,‘field’=>$tmp));  
  385.         return $cache;  
  386.     }  
  387.       
  388.      /** 
  389.      +———————————————————- 
  390.      * 把数据表的字段及主键序列化写入缓存文件 
  391.      +———————————————————- 
  392.      * @param array $arr 数据表字段组成的数组 
  393.      +———————————————————- 
  394.      * @return bool 
  395.      +———————————————————- 
  396.      */   
  397.       
  398.     private function _writeTableCache($arr)  
  399.     {  
  400.         $content=‘<?php exit;?>’.serialize($arr);  
  401.         fclose(fopen($this->tableCacheFile,‘w’));  
  402.         if(file_put_contents($this->tableCacheFile,$content)){  
  403.             return true;  
  404.         }else{  
  405.             return false;  
  406.         }  
  407.     }  
  408.       
  409.   
  410.     /** 
  411.      +———————————————————- 
  412.      * 析构函数回调 
  413.      +———————————————————- 
  414.      */   
  415.     
  416.     function __destruct()  
  417.     {  
  418.         $this->db=null;  
  419.         define(‘QUERYNUM’,$this->queryNum);  
  420.         if(conf(‘debug’)){  
  421.             foreach ($this->querySql as $v){  
  422.                 $sql.=$v.‘<br />’;  
  423.             }  
  424.             define(‘QUERYSQL’,$sql);  
  425.             define(‘CACHENUM’,$this->cacheNum);  
  426.         }  
  427.     }  
  428.   
  429. }  
  430. //fetch(‘PDO_FETCH_ASSOC’)  
  431.   
  432. ?>  

test.php (演示)

PHP代码
  1. <?php  
  2. require_once(‘db.class.php’);  
  3. if(!defined(‘APP_PATH’)) define(‘APP_PATH’, dirname(__FILE__));  
  4. $charset=conf(‘charset’)==‘utf8’?‘utf-8’:conf(‘charset’);  
  5. header("content-type:text/html; charset=$charset");   
  6.   
  7. function config($configNew)  
  8. {  
  9.     $config=array(  
  10.             ‘cacheDir’=>APP_PATH.‘/’.‘cache’,  
  11.             ‘charset’=>‘utf8’,  
  12.             ‘dbType’=>‘mysql’,  
  13.             ‘sessionType’=>‘data’,  
  14.             ‘tplFilename’=>‘.html’,  
  15.             ‘dbLink’=>‘pdo’,  
  16.             ‘dbHost’=>,  
  17.             ‘dbName’=>,  
  18.             ‘dbUser’=>,  
  19.             ‘dbPass’=>,  
  20.             ‘dbprefix’=>,  
  21.             );  
  22.     $conf=array_merge($config,$configNew);  
  23.     return $conf;  
  24. }  
  25.   
  26. function conf($key)  
  27. {  
  28.     global $config;  
  29.     return $config[$key];  
  30. }  
  31. $config=config(array(‘dbHost’=>‘localhost’,‘dbName’=>‘rb’,‘dbUser’=>‘root’,‘dbPass’=>‘root’));  
  32. $db=new db();  
  33.   
  34. $list=$db->dbCache(100,‘findAll’,‘xzy_article_title’,,,‘aid desc’,20);  
  35. if(emptyempty($list)) exit;  
  36. echo ‘<ul>’;  
  37. foreach($list as $v){  
  38.     echo ‘<li>’.$v[‘title’].‘ [‘.date(‘Y-m-d’,$v[‘addtime’]).‘]</li>’;  
  39. }  
  40. echo ‘</ul>’;  
  41. ?>  

生成的数据缓存:
aac.jpg

明天新公司正式开工了

很久没有写博客了,最近一直在忙些锁事,现在生活才算是恢复到正常轨道

希望新的公司能够牛年大旺,生意兴荣!

这个月月底,两个从小玩到大的好朋友也要来常州了,他们俩要跟我学段时间的php了,希望能达到一定的要求,然后留在一个公司,一起工作、一起奋斗!

公司新的项目马上要开工了,现在正在考虑框架的问题,以前自己也写过一个框架,这次想再仔细规划一下,再写出一个适用的、好用点的框架来上新的项目。也在考虑是否使用成熟的开源框架进行开发。一直以来,并不喜欢用别人的东西,我喜欢挑战自己,所以现在再底怎么选用也要仔细考虑考虑!

在新的一年里,有几个目标:
1,公司顺利,事业顺利
2,自己准备运营一个小型网站,用以培养一下网站的运营经验,不求有什么大收获,只求学习经验!
3,两个好朋友想走php这条路,我就想认真带一带,将来三个人的话,想做些大项目也有人手!
4,认真学习第二门编程语言,初步选的是C#或是Java!
5,多赚些钱,一切靠自己的努力供个房
6,帮女朋友在常州开个店,或是淘宝上开个店,并且生意兴荣!

目前已知的二种通过web免费发送短信到指定的手机

这二种免费发送短信到手机的方法都只适用于自己的手机,或是朋友手机(需做一定的设置),并且一定是移动的号!不可向任意手机发送短信!

所以这二种方法只适合把网站的留言或是订单信息发送到指定的手机中,当然也可以在php程序里写好,比如把每天的网站统计或是监控服务器异常等,可以做的事情就多了。。。。

第一种,利用的是移动的139邮箱的邮件到达提醒功能,http://www.139.com 先用自己的手机号申请免费的邮箱!
在环境配置控制面板里找到收信助理。然后,点击下面的添加,添加一条添加过滤条件,指定你要发送邮件的发送方邮箱地址(这个可以在php程序里设置)
注:发送短信通知,只发送邮件的标题(适用于小内容) 发送信件正文内容则是再把邮件的正文中的250个汉字发送至短信
这样做的目的是减少短信骚扰,因为139邮箱可以把全部的邮件通过短信通知方式发送到你的手机。

这种方法,因为是邮箱模式,所以有一定的延时,并且因为邮件头也会发送至短信,所以一般是多条短信发过来,比较烦!但有一个好处,不管是php或是其它语言,只要能发email就可以实现。在php里如果能过mail()发送的话,速度会非常的快 但注意 邮件的标题和正文都必需gb2312的编码(在utf-8时,注意转换一下这二块内容的编码)

第二种,利用飞信开放的API,网络上有大牛写了php发送飞信的类库。这种方法前提是你自己得申请一个飞信号,记好自己飞信的密码,然后直接php调用php发飞信信息的类,就完成了!非常方便,但缺点是速度比较慢

演示:http://www.ye55.com/fetion

下载:

fetion.zip

php分词实现mysql全文检索

感谢thinkphp中英分词算法的作者!

最近项目需要做全文检索方面,所以找了thinkphp中英分词算法进行拓展,首先把词库sqlite形式转成了mysql

其次把分词后的中文转变成区位码形式,从而支持mysql的全文检索!

演示:http://www.ye55.cn/fc/fc.php

下载:http://www.ye55.cn/fc/group.zip   (内含词库sql文件,包含近30W词的词库,再次感谢yhustc)

主要的文件:WordSegment.class.php

 

PHP代码
  1. <?php   
  2. /** 
  3.  +—————————————————————————— 
  4.  * 中英文分词类库 
  5.  * 使用正向扫描最大字长匹配算法进行分词,使用未匹配词的队列识别字典中没有的词 
  6.  * 提供SQLITE字典查询作为参考,可以自己扩展字典查找的findinDict方法 
  7.  +—————————————————————————— 
  8.  */  
  9. class WordSegment  
  10. {//类定义开始  
  11.     // 存放结果的数组  
  12.     var $result = array();  
  13.   
  14.     /** 
  15.      +———————————————————- 
  16.      * 字典的连接句柄和字典查询次数 
  17.      +———————————————————- 
  18.      * @var integer 
  19.      * @access protected 
  20.      +———————————————————- 
  21.      */  
  22.     protected $db;  
  23.     var $querytimes = 0;  
  24.       
  25.     protected $enChar = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","1","2","3","4","5","6","7","8","9","0","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9");  
  26.   
  27.     /** 
  28.      +———————————————————- 
  29.      * 高频词列表,这次字很难单独组词,会干扰分词程序 
  30.      +———————————————————- 
  31.      * @var array 
  32.      * @access protected 
  33.      +———————————————————- 
  34.      */  
  35.     protected $highfreq = array(‘我’,‘是’,‘为’,‘了’,‘的’,‘你’,‘他’,‘她’,‘它’,‘们’,‘这’,‘那’,‘在’,‘和’,‘一’,‘不’,‘有’,‘对’,‘中’,‘这’,‘要’,‘上’,‘也’,‘人’,‘等’,‘说’);  
  36.   
  37.     /** 
  38.      +———————————————————- 
  39.      * 标点符号列表 
  40.      +———————————————————- 
  41.      * @var array 
  42.      * @access protected 
  43.      +———————————————————- 
  44.      */  
  45.     protected   
  46.     $sign = array(‘\r’,‘\n’,‘\t’,‘`’,‘~’,‘!’,‘@’,‘#’,‘$’,‘%’,‘^’,‘&’,‘*’,‘(‘,‘)’,‘-‘,‘_’,‘+’,‘=’,‘|’,‘\\’,’\,‘"’,‘;’,‘:’,‘/’,‘?’,‘.’,‘>’,‘,’,‘<‘,‘[‘,‘{‘,‘]’,‘}’,‘·’,‘~’,‘!’,‘@’,‘#’,‘¥’,‘%’,‘……’,‘&’,‘×’,‘(’,‘)’,‘-’,‘——’,‘=’,‘+’,‘\’,‘|’,‘【’,‘{’,‘】’,‘}’,‘‘’,‘“’,‘”’,‘;’,‘:’,‘、’,‘?’,‘。’,‘》’,‘,’,‘《’,‘ ‘,‘ ’);  
  47.   
  48.     /** 
  49.      +———————————————————- 
  50.      * 挂载字典 
  51.      +———————————————————- 
  52.      * @static 
  53.      * @access public  
  54.      +———————————————————- 
  55.      * @param string $src 字典源 
  56.      +———————————————————- 
  57.      * @return void 
  58.      +———————————————————- 
  59.      */  
  60.      function openDict($pdo) {  
  61.         $this->db= new PDO($pdo[‘dbType’].‘:host=’.$pdo[‘dbHost’].‘;dbname=’.$pdo[‘dbName’], $pdo[‘dbUser’],$pdo[‘dbPass’]);  
  62.         $this->db->exec(‘SET NAMES utf8’);  
  63.      }  
  64.   
  65.     /** 
  66.      +———————————————————- 
  67.      * 卸载字典 
  68.      +———————————————————- 
  69.      * @static 
  70.      * @access public  
  71.      +———————————————————- 
  72.      * @param string $src 字典源 
  73.      +———————————————————- 
  74.      * @return void 
  75.      +———————————————————- 
  76.      */  
  77.      function closeDict() {  
  78.         $this->db=null;  
  79.      }  
  80.   
  81.     /** 
  82.      +———————————————————- 
  83.      * 在字典中查找字串.提供sqlite版本作为参考,用户可以自己扩展 
  84.      +———————————————————- 
  85.      * @static 
  86.      * @access public  
  87.      +———————————————————- 
  88.      * @param string $string 待查找的字符串 
  89.      +———————————————————- 
  90.      * @return bool 
  91.      +———————————————————- 
  92.      */  
  93.      function findinDict($string) {  
  94.         $this->querytimes++;  
  95.         $sql = "SELECT `word` FROM `dict` where `word`=‘".$string."’ limit 1"; 
  96.         $rs = $this->db->query($sql); 
  97.         if ($row=$rs->fetch(PDO::FETCH_ASSOC)) 
  98.             return true; 
  99.         else 
  100.             return false; 
  101.      } 
  102.  
  103.     /** 
  104.      +———————————————————- 
  105.      * 用中英文标点对句子进行粗分,划分成短句 
  106.      +———————————————————- 
  107.      * @static 
  108.      * @access public  
  109.      +———————————————————- 
  110.      * @param string $sentence 完整的句子 
  111.      * @param string $minSen 通过标点断句最短的词组长度 
  112.      * @param string $saveInter 是否保留标点符号 
  113.      * @param string $encoding 文字编码,默认为utf-8 
  114.      +———————————————————- 
  115.      * @return array 
  116.      +———————————————————- 
  117.      */ 
  118.      function cnSplit($sentence, $minSen, $saveInter, $encoding) { 
  119.         $len = mb_strlen($sentence,$encoding); 
  120.         $substring = array(); 
  121.         $cnTmpStr = "";  
  122.         $enTmpStr = ""; 
  123.  
  124.         for($i=0;$i<$len;$i++) 
  125.         { 
  126.             $char = mb_substr($sentence,$i,1,$encoding); 
  127.             if(in_array($char,$this->sign)) 
  128.             { 
  129.                 if($cnTmpStr != "") 
  130.                 { // 一连串的中文放入待分词的词组 
  131.                     if(mb_strlen(trim($cnTmpStr),$encoding)<=$minSen) // 遇到标点了,根据设置的标点断句最短的词组长度判断是否直接分词 
  132.                         $substring[] = array(trim($cnTmpStr),’1′); 
  133.                     else 
  134.                         $substring[] = array(trim($cnTmpStr),’0′); 
  135.                     $cnTmpStr = "";  
  136.                 }  
  137.   
  138.                 if($enTmpStr != "") 
  139.                 { // 一连串的英语字母或数字可以直接返回分词结果 
  140.                     $substring[] = array(trim($enTmpStr),’1′); 
  141.                     $enTmpStr = ""; 
  142.                 } 
  143.  
  144.                 if($saveInter) // 如果要保留标点可以直接返回分词结果 
  145.                     $substring[] = array($char,’1′); 
  146.             } 
  147.             else if(in_array($char,$this->enChar)) 
  148.             { 
  149.                 if($cnTmpStr != "") 
  150.                 { // 遇到英文或数字了,可以给中文句子断句了 
  151.                     if(mb_strlen(trim($cnTmpStr),$encoding)<=$minSen) // 遇到标点了,根据设置的标点断句最短的词组长度判断是否直接分词 
  152.                         $substring[] = array(trim($cnTmpStr),’1′); 
  153.                     else 
  154.                         $substring[] = array(trim($cnTmpStr),’0′); 
  155.                     $cnTmpStr = ""; 
  156.                 } 
  157.  
  158.                 $enTmpStr .= $char; 
  159.             } 
  160.             else 
  161.             { 
  162.                 if($enTmpStr != "") 
  163.                 { // 遇到中文了,可以给英文句子或数字断句了 
  164.                     $substring[] = array(trim($enTmpStr),’1′); 
  165.                     $enTmpStr = ""; 
  166.                 } 
  167.  
  168.                 $cnTmpStr .= $char; 
  169.             } 
  170.         } 
  171.          
  172.         // 追加没有添加到子句中的中英文句子 
  173.         if($cnTmpStr != "") {  
  174.             if($enTmpStr == "" && mb_strlen(trim($cnTmpStr),$encoding)<=$minSen) // 要判断一下后面没有英文词组,这样句子是在没有标点符号的情况下结束了 
  175.                 $substring[] = array(trim($cnTmpStr),’1′); 
  176.             else 
  177.                 $substring[] = array(trim($cnTmpStr),’0′); 
  178.         } 
  179.         if($enTmpStr != "") $substring[] = array(trim($enTmpStr),’1′); 
  180.  
  181.         return $substring; 
  182.      } 
  183.  
  184.      /** 
  185.      +———————————————————- 
  186.      * 分词函数 
  187.      +———————————————————- 
  188.      * @static 
  189.      * @access public  
  190.      +———————————————————- 
  191.      * @param string $sentence 待分词的句子 
  192.      * @param string $maxlen 每次取子串最长字数,默认为8个字.越大分词越慢,但是越准确 
  193.      * @param string $minSen 通过标点断句最短的词组长度 
  194.      * @param string $saveSingle 是否保留不能组词的单个的字 
  195.      * @param string $saveInter 是否保留标点符号 
  196.      * @param string $encoding 文字编码,默认为utf-8 
  197.      * @param string $dict 字典的连接字符串 
  198.      +———————————————————- 
  199.      * @return array 
  200.      +———————————————————- 
  201.      */ 
  202.      function segment($sentence,$pdo=array(‘dbType’=>’mysql’,’dbHost’=>’localhost’,’dbName’=>’furyee’,’dbUser’=>’root’,’dbPass’=>’root’),$maxlen = 8, $minSen = 3, $saveSingle = false, $saveInter = false, $encoding=’utf-8′) { 
  203.         $this->openDict($pdo); // 挂载字典 
  204.          
  205.         $this->result = array(); 
  206.         $this->querytimes = 0; 
  207.  
  208.         $subSens = $this->cnSplit($sentence, $minSen, $saveInter, $encoding); //使用标点将长句分成短句 
  209.  
  210.         foreach($subSens as $item) 
  211.         { 
  212.             if($item[1] == ‘1’) 
  213.             { 
  214.                 $this->result[] = trim($item[0]); 
  215.                 continue; 
  216.             } 
  217.             else 
  218.                 $subSen = $item[0]; 
  219.  
  220.             $bFind = false; 
  221.             $i = $j = $N = 0; // i,j是扫描的指针.N是本次扫描的子串字数上界 
  222.             $M = $maxlen; // 每次取子串最长字数,默认为8个字.M越大分词越慢,但是越准确 
  223.             $tmpStr = ”; //用来记录没有匹配的字,多个连续的未匹配的字认为组合成一个词. 
  224.             $sub_str = ”; //每次取的子串 
  225.  
  226.             $senLen = mb_strlen($subSen,$encoding); //字符串长度 
  227.              
  228.             while($i < $senLen) { 
  229.                 $N = ($i+$M) < $senLen ? $M : $senLen-$i; 
  230.                 //N是本次扫描的子串字数上界 
  231.                 $bFind = false; 
  232.                 for($j = $N; $j > 0; $j–) { 
  233.                     //取子串到字典中匹配 
  234.                     $sub_str = mb_substr($subSen,$i,$j,$encoding); //从$i指的地方开始,取$j的长度 
  235.  
  236.                     if($this->findinDict($sub_str)) { 
  237.                         // 字典中有该词 
  238.                         if(mb_strlen($tmpStr,$encoding) < 2 && !$saveSingle) //临时字符串中只有一个字或没有词 
  239.                             $tmpStr = ""; //清空它  
  240.                         else if($tmpStr != "") 
  241.                         { 
  242.                             $this->result[] = $tmpStr; //多个连续的没有匹配的字认为他组成一个生词 
  243.                             $tmpStr = ""; 
  244.                         } 
  245.  
  246.                         $this->result[] = $sub_str; 
  247.  
  248.                         $bFind = true; 
  249.                         $i+=$j; //指针后移 
  250.                         break; 
  251.                     } 
  252.                 } 
  253.  
  254.                 if(!$bFind) { 
  255.                     if(in_array($sub_str,$this->highfreq)) //当前单个字无法匹配,而且它是高频词 
  256.                     { 
  257.                         if(mb_strlen($tmpStr,$encoding) ==1 && !$saveSingle) 
  258.                         //临时字符串中只有一个字,遇到高频词可以进行断句,所以要判断一下临时队列 
  259.                             $tmpStr = ""; //清空它  
  260.                         else if($tmpStr != "") 
  261.                         { 
  262.                             $this->result[] = $tmpStr; //多个连续的没有匹配的字认为他组成一个生词 
  263.                             $tmpStr = ""; 
  264.                         } 
  265.  
  266.                         if($saveSingle) // 如果要保留单个的高频字,将它保留下来,否则剔除 
  267.                             $this->result[] = $sub_str; 
  268.                     } 
  269.                     else 
  270.                         $tmpStr .= $sub_str; //不是标点,是一个没有匹配的单个的字 
  271.                     $i++; 
  272.                 } 
  273.             } 
  274.             if($tmpStr !="" ) $this->result[] = $tmpStr; // 扫描结束,临时队列还有词,那应该是最后面无法进行分词的一些字 
  275.         } 
  276.         $this->closeDict(); //卸载字典 
  277.         return $this->result; 
  278.      } 
  279.  
  280.     function zhcode($sentence,$pdo=array(‘dbType’=>’mysql’,’dbHost’=>’localhost’,’dbName’=>’furyee’,’dbUser’=>’root’,’dbPass’=>’root’),$maxlen = 8, $minSen = 3, $saveSingle = false, $saveInter = false, $encoding=’utf-8′) 
  281.     { 
  282.         $val=”; 
  283.         $arr=$this->segment($sentence,$pdo,$maxlen,$minSen,$saveSingle,$saveInter,$encoding); 
  284.          
  285.         $str=implode(‘ ‘,$arr); 
  286.         $strlen=mb_strlen($str,$encoding); 
  287.          
  288.         for($i=0;$i<$strlen;$i++){ 
  289.             $tmpstr=mb_substr($str,$i,1,$encoding);          
  290.             if(strlen($tmpstr)==1){ 
  291.                 $val.=$tmpstr; 
  292.             }else{ 
  293.                 //echo $tmpstr.'<br>’; 
  294.                 $tmpstr=iconv(‘UTF-8′,’GB2312’,$tmpstr); 
  295.                 $str_qwm = sprintf("%02d%02d",ord($tmpstr[0])-160,ord($tmpstr[1])-160);  
  296.                 //echo iconv(‘GB2312′,’UTF-8′,$tmpstr).$str_qwm.'<br>’;  
  297.                 $val.=$str_qwm;   
  298.             }  
  299.         }  
  300.           
  301.         return array($val,$arr);  
  302.     }  
  303. }  
  304. ?>  

 

 

演示文件: fc.php

 

PHP代码
  1. <?php  
  2. $starttime = ExecTime();  
  3. include(‘WordSegment.class.php’);  
  4. $str=‘冻番茄www.phpd.cn<p>现在市面上的樱花啊,爆米花的笔都可以画出美丽可爱的立体图案,可以装饰手机什么的,但是价钱贵,还不方便,比方说爆米花的,就要通过加热才会有效果.</p><p>最好有一种写出来就是爆米花的效果的笔.那就最好了,最好还可以通过不停的温度有不同的颜色(就像会变色的手表)和效果……</p><p><img src="/upload/image/2008-09-01/2008090104363891/55a19b38ee7f6671e64b7ee46feb2b0a.jpg" alt="" /></p>’;  
  5.   
  6. $ws = new WordSegment; // 实例化一个分词类的对象  
  7. $result = $ws->zhcode($str);  
  8. print_r($result);  
  9. $totaltime =ExecTime()-$starttime ;  
  10. echo "<BR><BR><BR>分词时间: $totaltime 秒<br><br>www.phpd.cn 冻番茄";  
  11. function ExecTime(){  
  12.     $time = explode(" ", microtime());  
  13.     $usec = (double)$time[0];  
  14.     $sec = (double)$time[1];  
  15.     return $sec + $usec;  
  16. }  
  17. ?>  

 

换了一个vps用,以前的到期了

http://thenynocportal.com/aff.php?aff=084

3.95$*12 (不支持月付,全年折合人民币320左右)

5G硬盘 256M内存(使用FREE512MB 优惠码赠送了512m内存 FREE500GB赠送500G的硬盘)500G每月的流量 2个独立ip

安装软件:ubuntu 8.04  nginx+php5+mysql5+postfix

机房位于美国洛杉矶,ping的速度还可以,不过http下载的速度有点慢

http://www.ye55.cn

aa21.jpgaa.jpg