PHP PECL 扩展库安装

https://pecl.php.net/

PECL is a repository for PHP Extensions, providing a directory of all known extensions

搜索下载对应的PHP扩展库原码
#如果不安装php-devel就不会有phpize和php-config

/usr/bin/phpize              # php安装后的路径(不知道位置的可以whereis phpize 查看位置)
./configure --with-php-config=/usr/bin/php-config
make && make install

修改php.ini文件 , 增加如下内容:

extension=XXX.so  #增加对应的扩展库名

重启php-fpm: 或httpd

systemctl restart php-fpm
OR
systemctl restart httpd

在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC(可选的PHP缓存)

在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC

APC(可选的PHP缓存)是一个免费,开源的PHP代码缓存。这个模块的主要目的是提供一个健壮的框架来缓存和优化PHP代码。

在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC

在Linux上安装和开启PHP APC

该说明文档描述了如何在RHEL 6.3/6.2/6.1/6/5.8/5.6,CentOS 6.3/6.2/6.1/6/5.8/5.6Fedora 17,16,15,14,13,12上使用PECL命令从代码仓库中下载,安装以及开启APC

安装APC的依赖包

首先,我们需要安装所需的软件包,pecl,phpize和apxs命令,并使用YUM包管理工具来安装APC。

yum install php-pear php-devel httpd-devel pcre-devel gcc make

使用PECL安装APC

现在我们已经安装了所有必须的软件包以用来安装APC。接下来我们使用PECL命令来安装它。安装过程中请选择默认的设置值。

pecl install apc

输出如下:
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading APC-3.1.9.tgz ...
Starting to download APC-3.1.9.tgz (155,540 bytes)
.................................done: 155,540 bytes
54 source files, building
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
config.m4:180: warning: AC_CACHE_VAL(PHP_APC_GCC_ATOMICS, ...): suspicious cache-id, must contain _cv_ to be cached
../../lib/autoconf/general.m4:1974: AC_CACHE_VAL is expanded from...
../../lib/autoconf/general.m4:1994: AC_CACHE_CHECK is expanded from...
config.m4:180: the top level
config.m4:180: warning: AC_CACHE_VAL(PHP_APC_GCC_ATOMICS, ...): suspicious cache-id, must contain _cv_ to be cached
../../lib/autoconf/general.m4:1974: AC_CACHE_VAL is expanded from...
../../lib/autoconf/general.m4:1994: AC_CACHE_CHECK is expanded from...
config.m4:180: the top level Enable internal debugging in APC [no] : Enable per request file info about files used from the APC cache [no] : Enable spin locks (EXPERIMENTAL) [no] : Enable memory protection (EXPERIMENTAL) [no] : Enable pthread mutexes (default) [yes] : Enable pthread read/write locks (EXPERIMENTAL) [no] :

开启PHP的APC扩展模块

运行下面的命令以开启APC扩展模块在Apache配置中

echo "extension=apc.so" > /etc/php.d/apc.ini

重启Apache服务

重启Apache服务以使新的更改生效。

service httpd restart
OR
/etc/init.d/httpd restart

在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC

开启PHP APC管理

开启APC管理面板,你需要复制下面的文件:

cp /usr/share/pear/apc.php /var/www/html/

接下来打开apc.php文件

# vi /var/www/html/apc.php

如下所示,在apc.php文件中设置用户名及密码。

defaults('ADMIN_USERNAME','apc');       // Admin Username
defaults('ADMIN_PASSWORD','Set-Password-Here');  // Admin Password - CHANGE THIS TO ENABLE!!!

在浏览器中输入如下的URL链接,你将可以使用APC的管理面板。

http://localhost/apc.php

在RHEL/CentOS 6.3/5.6和Fedora 17/12上安装APC

使用PECL升级APC

执行如下的命令即可下载并升级APC

pecl upgrade apc

使用PECL卸载APC

如果你想移除它,使用如下的命令即可从你的系统中完全移除APC。

pecl uninstall apc

cURL超时设置

一般我们访问HTTP方式很多,主要是:curl, socket, file_get_contents() 等方法。
如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。

CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。

curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括:
*(重要) CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。
*(重要) CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。
(在cURL 7.16.2中被加入。从PHP 5.2.3起可使用)

CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。
(在cURL 7.16.2中被加入。从PHP 5.2.3开始可用)

CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。

curl普通秒级超时:

$ch = curl_init();  
curl_setopt($ch, CURLOPT_URL,$url);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  
curl_setopt($ch, CURLOPT_TIMEOUT,60);   //只需要设置一个秒的数量就可以  
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);  

curl如果需要进行毫秒超时,需要增加:

curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1L);  
//或者是:  
curl_setopt ( $ch,  CURLOPT_NOSIGNAL,true);//是可以支持毫秒级别超时设置的  

curl一个毫秒级超时的例子:

if(!isset($_GET['foo'])){  
        // Client  
        $ch = curl_init('http://example.com/');  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);  
        curl_setopt($ch, CURLOPT_NOSIGNAL,1);    //注意,毫秒超时一定要设置这个  
        curl_setopt($ch, CURLOPT_TIMEOUT_MS,200);  //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用  
        $data = curl_exec($ch);  
        $curl_errno = curl_errno($ch);  
        $curl_error = curl_error($ch);  
        curl_close($ch);  
   
        if($curl_errno >0){  
                echo "cURL Error ($curl_errno): $curl_error\n";  
        }else{  
                echo "Data received: $data\n";  
        }  
}else{  
        // Server  
        sleep(10);  
        echo "Done.";  
}  

其他一些技巧:
1. 按照经验总结是:cURL 版本 >= libcurl/7.21.0 版本,毫秒级超时是一定生效的,切记。
2. curl_multi的毫秒级超时也有问题。。单次访问是支持ms级超时的,curl_multi并行调多个会不准

验证URL字符串的正则

验证URL字符串的正则

^(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(\w+\.))*(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[\d]+)?(/[\w\&%_\./-~-\W]*)?$

在PHP中的写法为:

if(preg_match("@^(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(\w+\.))*(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[\d]+)?(/[\w\&%_\./-~-\W]*)?$@i", $_url))

POST调试工具

实际开发工作中,很多时候需要用到POST提交值,每次都需要针对写出相对的POST环境,

所以写出这个POST调试工具公共库,方便调试使用。

程序运行环境需要php 及 extension=php_curl.dll

调试时填写的内容:

提交的网址:填写需要调试的网址

提交的变量:分别填写变量名及变量值,可以添加多个变量,及多行(TEXT)变量

提交执行提供了正常执行,返回原码,解析JSON,解析XML 多种操作

可以将返回直接显示,也可以解析后直观显示

在线运行:http://www.zhisg.com/post.php

post调试工具下载

Imghash:相似图片搜索的php实现

前几天看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理,主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来。文章详细的介绍了相似图片搜索处理的相关步骤,并且给出了一个python的实现,由于我对PHP比较熟,所以写了个PHP的版本。
图片相似搜索的简单原理
根据文章里的描述,其实原理比较简单,大致有如下几个步骤:

1、缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

2、简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。

3、计算平均值。计算所有64个像素的灰度平均值。

4、比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。

5、计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。

图片相似搜索的PHP实现
原文中给出了一个python版本的实现,代码只有53行。我写了个对应的PHP版本,由于直接是用类写的,所以代码有100行,具体如下:

class Imghash{
	
	private static $_instance = null;
	
	public $rate = 2;
	
	public static function getInstance(){
		if (self::$_instance === null){
			self::$_instance = new self();
		}
		return self::$_instance;
	}
	public function run($file){
		if (!function_exists('imagecreatetruecolor')){
			throw new Exception('must load gd lib', 1);
		}
		$isString = false;
		if (is_string($file)){
			$file = array($file);
			$isString = true;
		}
		$result = array();
		foreach ($file as $f){
			$result[] = $this->hash($f);
		}
		return $isString ? $result[0] : $result;
	}
	public function checkIsSimilarImg($imgHash, $otherImgHash){
		if (file_exists($imgHash) && file_exists($otherImgHash)){
			$imgHash = $this->run($imgHash);
			$otherImgHash = $this->run($otherImgHash);
		}
		if (strlen($imgHash) !== strlen($otherImgHash)) return false;
		$count = 0;
		$len = strlen($imgHash);
		for($i=0;$i<$len;$i++){
			if ($imgHash{$i} !== $otherImgHash{$i}){
				$count++;
			}
		}
		return $count <= (5 * $rate * $rate) ? true : false;
	}
	public function hash($file){
		if (!file_exists($file)){
			return false;
		}
		$height = 8 * $this->rate;
		$width = 8 * $this->rate;
		$img = imagecreatetruecolor($width, $height);
		list($w, $h) = getimagesize($file);
		$source = $this->createImg($file);
		imagecopyresampled($img, $source, 0, 0, 0, 0, $width, $height, $w, $h);
		$value = $this->getHashValue($img);
		imagedestroy($img);
		return $value;
	}
	public function getHashValue($img){
		$width = imagesx($img);
		$height = imagesy($img);
		$total = 0;
		$array = array();
		for ($y=0;$y<$height;$y++){
			for ($x=0;$x<$width;$x++){
				$gray = ( imagecolorat($img, $x, $y) >> 8 ) & 0xFF;
				if (!is_array($array[$y])){
					$array[$y] = array();
				}
				$array[$y][$x] = $gray;
				$total += $gray;
			}
		}
		$average = intval($total / (64 * $this->rate * $this->rate));
		$result = '';
		for ($y=0;$y<$height;$y++){
			for ($x=0;$x<$width;$x++){
				if ($array[$y][$x] >= $average){
					$result .= '1';
				}else{
					$result .= '0';
				}
			}
		}
		return $result;
	}
	public function createImg($file){
		$ext = $this->getFileExt($file);
		if ($ext === 'jpeg') $ext = 'jpg';
		$img = null;
		switch ($ext){
			case 'png' : $img = imagecreatefrompng($file);break;
			case 'jpg' : $img = imagecreatefromjpeg($file);break;
			case 'gif' : $img = imagecreatefromgif($file);
		}
		return $img;
	}
	public function getFileExt($file){
		$infos = explode('.', $file);
		$ext = strtolower($infos[count($infos) - 1]);
		return $ext;
	}
}
require_once “Imghash.class.php”;
$instance = ImgHash::getInstance();
$result = $instance->checkIsSimilarImg(‘chenyin/IMG_3214.png’, ‘chenyin/IMG_3212.JPG’);

如果$result值为true, 则表明2个图片相似,否则不相似。

在实际的相似图片搜索中,算图片的指纹并不是难点,难点而是在怎么从海量的图片指纹里找出与之相似的指纹。

Apache2.2整合PHP5.3以上的版本时提示错误Cannot load php5apache2_2.dll into server解决方法

Apache2.2整合PHP5.3以上的版本时提示错误“Cannot load php5apache2_2.dll into server ”

故障现象:
  在命令符方式下启动Apache时提示错误信息“httpd: Syntax error on line 129 of D:/serviceRoot/Apache2.2/conf/httpd.conf: Cannot load D:/serviceRoot/PHP5.4.3/php5apache2_2.dll into server”,导致Apache无法启动。
  Apache的配置文件D:/Apache/conf/httpd.conf 第129行内容为:
  LoadModule php5_module D:/serviceRoot/PHP5.4.3/php5apache2_2.dll
  注意:其中D:/serviceRoot/PHP5.4.3/php5apache2_2.dll是我安装php的相应路径。Apache为2.2.22版本,php为5.4.3版本。

出现错误的原因:
  在网上查到一位朋友遇到类似情况,并提示根据PHP的安装文件名称“php-5.3.6-Win32-VC9-x86.zip”得知该版本的PHP安装文件是由VC编译完成的,因此如需要运行或调用该PHP压缩包中的相关文件,则需要首先安装VC的运行时环境。如果你的机器没有安装有VC运行时环境,则Apache调用该PHP压缩包中的相关文件时会提示如上错误信息。

解决方法:
  在网上搜索“VC2008可再发行组件”或者是“VC2008运行库”,下载安装后即可解决此故障。

PHP 5.5 新增 Generators 特性 yield 标签

简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,php 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

function xrange($start, $limit, $step = 1) {
for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } echo 'Single digit odd numbers: '; /* 注意保存在内存中的数组绝不会被创建或返回 */ foreach (xrange(1, 9, 2) as $number) { echo "$number "; }

PHP 查询两个字符串的相似度

PHP similar_text() 函数 : similar_text(string1,string2,percent)
以及 levenshtein() 函数 : levenshtein(string1,string2,insert,replace,delete)
两个函数可以计算出两个字符串的相似值,用此两个函数可以进行模糊查询,进行相似度查询。

levenshtein() 函数返回两个字符串之间的 Levenshtein 距离。
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如把 kitten 转换为 sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
levenshtein() 函数给每个操作(替换、插入和删除)相同的权重。不过,您可以通过设置可选的 insert、replace、delete 参数,来定义每个操作的代价。


similar_text() 函数计算两个字符串的匹配字符的数目。
该函数也可以计算两个字符串的相似度(以百分比计)。

注释:levenshtein() 函数比 similar_text() 函数更快。不过,similar_text() 函数通过更少的必需修改次数提供更精确的结果。

Deprecated: Function ereg() is deprecated的解决方法

这个问题是因为你用的php版本过高。

在php5.3中,正则函数ereg_replace已经废弃,而dedecms还继续用。有两个方案可以解决以上问题:

1、把php版本换到v5.3下。

2、继续使用v5.3,修改php.ini文件

;extension=php_mbstring.dll

改为

extension=php_mbstring.dll

;mbstring.func_overload = 0

修改为:

mbstring.func_overload = 7

或者使用其他的函数:

define(‘DEDEADMIN’, ereg_replace(“[/\\]{1,}”, ‘/’, dirname(__FILE__) ) );
//改为
define(‘DEDEADMIN’, preg_replace(“/[\/\\\\]{1,}/”, ‘/’, dirname(__FILE__) ) );

注:因为preg_replace比ereg_replace的执行速度快,PHP推荐使用preg_replace.

PHP 判断字符串是否为全英文,英汉混合,纯汉字方法

方法一:

function is_chinese($s){
        $allen = preg_match("/^[^\x80-\xff]+$/", $s);   //判断是否是英文
        $allcn = preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/",$s);  //是否是中文
        if($allen){  
              return 'allen';  
        }else{  
              if($allcn){  
                   return 'allcn';  
              }else{  
                   return 'encn';  
              }  
        } 
   }

方法二:
利用Php的mb_strlen和strlen函数就可以轻松得知字符串的构成是全英文、英汉混合、还是纯汉字。简要说明如下(以上示例程序)
1、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度一致,可以判断是纯英文字符串。
2、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度不一致,且strlen返回值同mb_strlen的返回值求余后得0可以判断为是全汉字的字符串。
3、如果strlen返回的字符长度和mb_strlen以当前编码计算的长度不一致,且strlen返回值同mb_strlen的返回值求余后不为0,可以判断为是英汉混合的字符串。

function Check_stringType($str1) {
	        $strA = trim($str1);
	        $lenA = strlen($strA);
	        $lenB = mb_strlen($strA, "utf-8");
	        if ($lenA === $lenB) {
	            return "1"; //全英文
	        } else {
	            if ($lenA % $lenB == 0) {
	                return "2"; //全中文
	            } else {
	                return "3"; //中英混合
	            }
	       }
	 }