Tag Archives: PHP

Centos下添加PHP对MSSQL的支持

其实很少会有连接SQL Server的机会,不过我们公司刚好有个应用需要使用的SQL Server的数据库,所以也知道给LNMP安装MSSQL的扩展。
搜索网上的相关文章一般的解决方案是Freetds,Freetds的主要功能就是让Linux系统可以访问SQL Server服务。

安装Freetds

Freetds 官方网站是 http://www.freetds.org,可以去官方网站下载程序,文中下载的是0.92.79版本。

wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-0.92.79.tar.gz

然后解压,并且编译安装

tar -zxvf freetds-0.92.79.tar.gz
cd freetds-0.92.79
./configure --prefix=/usr/local/freetds
gmake
gmake install

安装完成后可以使用命令测试下

/usr/local/freetds/bin/tsql -S 192.168.0.10:1433 -U sa

安装PHP的MSSQL扩展

本服务器使用的是lnmp集成环境,php是5.3.21;如果是单独安装php的也一样;先进入下载加压后的PHP文件目录,然后编译安装

cd /data/lnmp0.9-full/php-5.3.21
cd ext/mssql
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds
make
make install

随后在php.ini中添加扩展

vim /usr/local/php/etc/php.ini

在最后加入一行

extension = "mssql.so"

最后重启php即可

配置Freetds

vim /usr/local/freetds/etc/freetds.conf

在文件中加入以下语句

[sqlservername]
host = 192.168.0.10
port = 1433
tds version = 7.0
client charset = UTF-8

PHP中测试连接

新建一个php文件,放入以下代码

$conn = mssql_connect("sqlservername", "sa", "password") or die ("无法连接");
echo $conn;

现在你的php已经完全支持连接SQL Server了。

PHP基于openCV实现人脸识别

最近公司在做一个面部识别的项目,突然想起来OpenCV也有相关功能,并且还有PHP的扩展;因为OpenCV是开源的,就想到配置起来玩玩。

首先我们下载OpenCV源代码进行编译,首先可以去OpenCV的官方网站(http://opencv.org/)下载最新的版本,我这里下载的是2.4.2版本。

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.2/OpenCV-2.4.2.tar.bz2
tar -jxvf OpenCV-2.4.2.tar.bz2
cd OpenCV-2.4.2
mkdir release
cd release/
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make && make install

这里我们发现使用了cmake命令,没有的可以先安装下,我是Centos系统,直接yum install cmake

接下来就是安装facedetect的PHP扩展,一样是先到官方网站(http://www.xarg.org/project/php-facedetect/)下载最新的源码包,然后编译安装。

wget https://nodeload.github.com/infusion/PHP-Facedetect/zipball/master
unzip infusion-PHP-Facedetect-4b1dfe1.zip
cd infusion-PHP-Facedetect-4b1dfe1
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

最后就是在php.ini中加入扩展

extension=facedetect.so

保存,重启php或Apache

/etc/init.d/php-fpm restart
/etc/init.d/httpd -k restart

这个PHP的扩展只提供了两个方法,官方网站也有具体介绍

array face_detect(string picture_path, string cascade_file)
int face_count(string picture_path, string cascade_file)

face_detect方法需要带入两个参数,照片和模版文件,输出一个数组,数组中有人脸的坐标和大小
face_count方法同样需要上面两个参数,输出是照片中人脸的数量。

下面是一个简单的例子,找出人脸并切将他框出来(因为要操作图片,所以要用到GD库):

<?php
$face = "pb.jpg";
$faces = face_detect($face, "haarcascades/haarcascade_frontalface_alt.xml");

$image = imagecreatefromjpeg ($face);
$backgroundcolor = ImageColorAllocate($image, 255, 0, 0);
if (is_array($faces)){
        foreach ($faces as $v){
                imagerectangle($image, $v[x], $v[y], $v[x]+$v[w], $v[y]+$v[h], $backgroundcolor);
        }
}
header('Content-type: image/jpeg');
imagejpeg($image);
?>

DEMO地址:http://honglei.net/demo/face.php
有人会问那个模版的XML哪里来,进入前面OpenCV的解压目录,有没有看到一个haarcascades的文件夹,进入,是不是有很多XML文件,你还会发现除了上面提到的脸的模版还有鼻子,眼睛,耳朵的;这些模版都可以用,分别能找出不同的结果,至于哪个模版好,哪个模版不好那就你自己试试看,我测试的结果是haarcascade_frontalface_alt.xml相对较准。
运行上面的PHP会发现找出了所有的脸,但是有个找错了,并且消耗的时间也比较长;要真正将这个大规模应用还需要靠你自己作一定的优化,并且还要了解下找脸的思想。
其实找脸只是看着比较酷,在实际应用中其实也没有啥地方好用的,我能想到的就是辅助生成头像和做一些利用人脸的图片。

LNMP添加ImageMagick

ImageMagick 是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。

但是LNMP只默认安装了GD,在此提供下LNMP下安装ImageMagick以及imagick扩展的方法。

1、安装ImageMagick
首先要下载最新的编译包,最新的包可以在下面的地址中找到http://www.imagemagick.org/download/
我们在这里选择ImageMagick-6.7.8-8.tar.gz

wget http://www.imagemagick.org/download/ImageMagick-6.7.8-8.tar.gz
tar -zxvf ImageMagick-6.7.8-8.tar.gz
cd ImageMagick-6.7.8-8/
./configure --prefix=/usr/local/imagemagick
make && make install

安装完成后可以使用以下命令验证下

convert -version

如果正常会显示版本号;也可能会出现错误“convert: error while loading shared libraries: libMagickCore.so.3: cannot open shared object file: No such file or directory”
如果不幸出现可以使用命令

ldconfig /usr/

2、安装imagick(PHP的扩展)
和上面一样,先下载编译包,最新的包可以在下面的地址中找到http://pecl.php.net/package/imagick
我们选择imagick-3.0.1.tgz,建议尽量选择正式版本

wget http://pecl.php.net/get/imagick-3.0.1.tgz
tar -zxvf imagick-3.0.1.tgz
cd imagick-3.0.1/
export PKG_CONFIG_PATH=/usr/local/imagemagick/lib/pkgconfig
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick
make && make install

3、配置php.ini
需要在php.ini中添加imagick扩展

vim /usr/local/php/etc/php.ini

然后添加:

extension = "imagick.so"

保存并退出

4、重启PHP-FPM或Apache

/etc/init.d/php-fpm restart
/etc/init.d/httpd -k restart

一般情况通过上述几部就能搞定,如果遇到问题可以Google下解决掉。
LNMP.org已经提供现成的sh,可以直接用

PHP实现排列组合

昨天朋友问有没有可能随机排列若干词根的软件?
我还真没有接触过类似软件,但是想了下应该需求不难,就答应帮他写一个。

开始些的时候才发现什么排列组合都还给老师了,连公式都忘记了,于是想偷懒点去Google搜索一个算法了事;一搜索才发现排列算法确实有说,但是也不是很完善,只能实现A(5,5)这样的需求,不能实现A(5,3)这样的需求,组合更加是没有搜索到;无奈只能自己写了。

先从新了解排列组合算法(百度百科中排列组合的知识http://baike.baidu.com/view/738955.htm);惊奇的发现原来排列已经由P:Permutation改成了A:Arrangement,看来以后教育宝宝会出现沟通问题了,哈哈。

文中有对公式的描述:
A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!
C(n,m)=A(n,m)/m!=n!/((n-m)!*m!)

有这两个公式就能知道结果数量怎么算
排列算法:

<?php
function a($n, $m){
	if($n < $m) return false;
	$num = 1;
	for($i=0; $i<$m; $i++){
		$num = $num * ($n-$i);
	}
	return $num;
}
?>

组合算法:

<?php
function c($n, $m){
	if($n < $m) return false;
	return a($n,$m)/a($m,$m);
}
?>

应用方法:

<?php echo a(5,3) ?>
<?php echo c(5,3) ?>

上面只能得到结果的数量不能枚举所有情况,继续考虑他的逻辑,最后得到枚举算法(似乎说的很简单,不过思考逻辑不好描述,程序中看端倪吧)
排列枚举算法:

<?php
function arrangement($arr, $len=0, $str="") {
	global $res;
	$arr_len = count($arr);
	if($len == 0){
		$res[] = $str;
	}else{
		for($i=0; $i<$arr_len; $i++){
			$tmp = array_shift($arr);
			arrangement($arr, $len-1, $str."\t".$tmp);
			array_push($arr, $tmp);
		}
	}
}
?>

组合枚举算法:

<?php
function combination($arr, $len=0, $str="") {
	global $res;
	$arr_len = count($arr);
	if($len == 0){
		$res[] = $str;
	}else{
		for($i=0; $i<$arr_len-$len+1; $i++){
			$tmp = array_shift($arr);
			combination($arr, $len-1, $str."\t".$tmp);
		}
	}
}
?>

应用方法:

<?php
$arr = array(1,2,3,4,5,6,7);//词根
$num = 2;//所需使用词根的数量
$res = array();结果集
arrangement($arr, $num);//进行排列运算
var_dump($res);//输出排列结果

$res = array();
combination($arr, $num);//进行组合运算
var_dump($res);//输出组合结果
?>

因为PHP的效率问题,不适宜做太大量的运算,程序的效率我个人觉得已经最优,如有不足还望高人指点。

最后给出我做的一个demo的地址 http://www.honglei.net/demo/aandc.php

给朋友后他非常满意,还说这个在Taobao能卖钱,似乎是什么选关键词可以用;如果有需要的朋友就直接用吧,能帮上大家的忙我也很开心。