centos 7.0 安装Memcached以及配置php的Memcache扩展

因项目需求,需要在centos 7.0上安装Memcached以及配置php的Memcache扩展。所以只好通过网上资料一步一步来安装和配置了。

第一步: 准备工具

下载memcached和memcache源码

1.  memcached官网: http://memcached.org/downloads

20160517085016

2. php扩展: http://pecl.php.net/package/memcache

20160517085424

第二步: 安装

1. 安装memcached

#下载memcached源码 
wget wget http://memcached.org/files/memcached-1.4.25.tar.gz
#解压
tar -zxvf memcached-1.4.25.tar.gz
#切换到解压后的目录
cd memcached-1.4.25

20160517091628

#配置
./configure --prefix=/usr/local/memcached

20160517091648

If it’s already installed, specify its path using –with-libevent=/dir/

需要安装libevent,从http://libevent.org/下载libevent-2.0.22-stable.tar.gz,并编译安装。

#下载libevent源码
wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
#解压
tar -zxvf libevent-2.0.22-stable.tar.gz
#切换到解压后的目录
cd libevent-2.0.22-stable
#配置
./configure --prefix=/usr/local/libevent
#编译安装
make && make install

20160517092757 20160517092851

#再次配置memcache
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
#安装
make && make install

20160517093315 20160517093341

#设置环境
ln -s /usr/local/memcached/bin/memcached /usr/bin/memcached
cp scripts/memcached.sysv /etc/init.d/memcached
 
#改为监听127.0.0.1,并关闭UDP连接方式,若为远程服务调用或不需要的话请跳过此行
sed -i 's/OPTIONS=""/OPTIONS="-l 127.0.0.1 -U 0"/g' /etc/init.d/memcached 
 
sed -i 's@chown@#chown@' /etc/init.d/memcached
sed -i 's@/var/run/memcached/memcached.pid@/var/run/memcached.pid@' /etc/init.d/memcached
 
#启动并设置开机服务
chmod +x /etc/init.d/memcached
service memcached start
chkconfig --add memcached
chkconfig memcached on

2. 安装php的memcache扩展

#从github下载PHP7专用的memcached组件分支 
wget https://github.com/php-memcached-dev/php-memcached/archive/php7.zip
#从官方下载php-memcached的最新源码包
wget http://pecl.php.net/get/memcached-2.2.0.tgz
#解压
unzip php7.zip
#切换到解压的目录
cd php-memcached-php7/

20160517094814

 /usr/local/php7/bin/phpize

20160517094814

#配置
./configure --with-php-config=/usr/local/php7/bin/php-config

20160517095424

configure: error: memcached support requires libmemcached. Use –with-libmemcached-dir=<DIR> to specify the prefix where libmemcached headers and library are located

需要安装libmemcached

#下载libmemcached
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
#解压
tar -zxvf libmemcached-1.0.18.tar.gz
#切换到解压后的目录
cd libmemcached-1.0.18
#配置
./configure --with-memcached=/usr/local/memcached --prefix=/usr/local/libmemcached
#编译安装
make && make install
#再次配置 php-memcached-php7
./configure --with-php-config=/usr/local/php7/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached

20160517101250

configure: error: no, sasl.h is not available. Run configure with –disable-memcached-sasl to disable this check

yum install cyrus-sasl-devel

20160517101433

备注: 安装完之后,记得重新配置、编译、安装libmemcached

#再次配置 php-memcached-php7
./configure --with-php-config=/usr/local/php7/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached

20160517102332

#编译安装php-memcached-php7
make && make install

20160517102513

3. 开启memcache扩展

在php.ini文件中开启memcache

extension=memcached.so

重启php-fpm和nginx

20160517111852

第三步: 测试

1. 安装wordpress插件

下载https://github.com/tollmanz/wordpress-pecl-memcached-object-cache文件,解压获得object-cache.php文件,并放到wp-content目录下。

20160517115935

2. 查看效果

使用官方php的memcache扩展源码包中的memcache.php文件

20160517121536

20160517121751

修改代码如下:

20160517121922

把此文件放到自己指定目录下,然后再访问。

20160517122251

 

(JS-PHP)使用RSA算法进行加密通讯

用户名密码明文直接POST到后端,很容易被别人从监听到。注:包括使用MD5等哈希函数处理后的数据,这里也算做明文(现在MD5爆破网站已经很多了~)。对安全性要求较高的网站,比如银行和大型企业等都会使用HTTPS对其进行加密通讯。但是由于效率原因,使用HTTPS的代价是及其昂贵的,对于访问量稍大的网站就会造成严重的性能瓶颈。解决方法一般只能采用专门的SSL硬件加速设备如F5的BIGIP等。所以很多网站选择了模拟SSL的做法,使用RSA来对密码等安全信息进行公钥加密,服务端用私钥解密。

通常是对密码进行加密,具体如下:

第一步: 加载三个RSA的js库文件,可以到这里下载 http://www.ohdave.com/rsa/

20150612180052

第二步: 获取秘钥

1. 相关信息

通常情况下网站的SSL证书是由专门的CA机构(如VeriSign)颁发,同时需要交纳一定数额的费用。可是对于平时开发测试或其他情况下,我们自己也可以充当CA来生成自己颁发的证书。当然与前者相比缺点很明显:不能获得各个浏览器的信任,会弹出警告提示。不过,好消息是,对安全性要求稍低的网站现在可以考虑使用免费的CA认证(貌似是其级别最低的证书)。

跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:StartCom)也是一家CA机构,它的根证书很久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。在2009年9月份,StartSSL竟然搞定了微软:微软在升级补丁中,更新了通过Windows根证书认证程序(Windows Root Certificate Program)的厂商清单,并首次将StartCom公司列入了该认证清单,这是微软首次将提供免费数字验证技术的厂商加入根证书认证列表中。现在,在Windows 7或安装了升级补丁的Windows Vista或Windows XP操作系统中,系统会完全信任由StartCom这类免费数字认证机构认证的数字证书,从而使StartSSL也得到了IE浏览器的支持。

2. 要生成获得证书所需的密钥等文件

openssl genrsa -des3 -out server.pem 1024 
openssl req -new -key server.pem -out server.csr 
openssl rsa -in server.pem -out server.pem

161344272369

使用上面的命令就会创建一个证书申请,这里我们会要求输入国家、组织、姓名等信息,但是不会要求输入证书有效天数,因为证书有效天数是CA认证中心给我们的;然后我们会把这个生成好的cert.csr(Certificate Signing Request (CSR):证书签名申请)发给CA认证中心。CA认证中心通过后,会反馈(通常是邮件)回来认证的信息,再导入即可。

把上面生成的文件内容提交给CA,即可换取证书;若自行生成则:

openssl x509 -req -days 365 -in server.csr -signkey server.pem -out server.crt

161343106110

3. 获取十六进制的密钥

数据是用ASN.1编码过的,所以可以用openssl命令从密钥文件(key或pem)提取秘钥

openssl asn1parse -out temp.ans -i -inform PEM < server.pem

161354007522

 

4. javascript 加密代码

function rsa_pwd(content){ 
//十六进制公钥  
var rsa_n = "BC6539FEAD9E086D02E1268FF36E46A2843797559D15BE09...."; 
setMaxDigits(131);
 //131 => n的十六进制位数/2+3  
var key = new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六进制  
content_rsa = encryptedString(key, content); 
//不支持汉字  
return content_rsa;
 }

 5. php 加密/解密代码

<?php 
/** * 公钥加密 
 * * @param string 明文 
 * @param string 证书文件(.crt) 
 * @return string 密文(base64编码) 
 */ 
function publickey_encodeing($sourcestr, $fileName) { 
      $key_content = file_get_contents($fileName); 
      $pubkeyid = openssl_get_publickey($key_content);
      if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid)) { 
            return base64_encode("".$crypttext); 
       } 
} 
/** * 私钥解密 
* * @param string 密文(二进制格式且base64编码) 
* @param string 密钥文件(.pem / .key) 
* @param string 密文是否来源于JS的RSA加密 
* @return string 明文 
*/ 
function privatekey_decodeing($crypttext, $fileName, $fromjs = FALSE) { 
          $key_content = file_get_contents($fileName); 
          $prikeyid = openssl_get_privatekey($key_content); 
          $crypttext = base64_decode($crypttext); 
          $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING; 
          if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) { 
                     return $fromjs ? rtrim(strrev($sourcestr)) : "".$sourcestr; 
           } 
           return ''; 
}
 ?>

6. 测试代码

//JS->PHP 测试 $_POST['password']是js加密后的信息 
$txt_en = $_POST['password']; 
$txt_en = base64_encode(pack("H*", $txt_en)); 
$file = 'ssl/server.pem'; 
$txt_de = privatekey_decodeing($txt_en, $file, TRUE); 
var_dump($txt_de); 
//PHP->PHP 测试  $data = "汉字:1a2b3c"; 
$config = Core::getInstance()->config; 
$file1 = 'ssl/server.crt'; 
$file2 = 'ssl/server.pem'; 
$a = publickey_encodeing($data, $file1); 
$b = privatekey_decodeing($a, $file2); 
var_dump($b);

7. 需注意

PHP中openssl扩展公私钥加密函数只支持小数据,加密时117字节,解密时128字节。若不然得自己循环加密后合并。

SSL本身也只是用RSA来进行密钥加密,数据加密则是利用这个加密的密钥进行对称加密,以保证速度。所以万不可将其用于大数据量加密!

8. 本方案几处优点

1、安全性高。基于非对称的RSA算法加密数据,只要在私钥不被暴露的前提下,密钥长度足够长,短时间内基本是无法破解的。

2、使用方便。前端使用现成的JS库来实现加密,PHP端则可直接使用现成的openssl扩展,而不用RSA的PHP源码实现或自己开发扩展。

3、速度靠谱。由于RSA解密算法相当复杂,而该操作交由PHP端扩展来实现,效率上比网上的PHP代码要高许多。

4、便于升级。密钥是直接从linux下openssl工具生成的证书中获取,不仅不用其他密钥生成工具,也方便今后升级到真正的HTTPS。

9. 参考文章

http://www.jishuer.com/static/article-270.html

http://blog.csdn.net/linvo/article/details/5619807

http://blog.sina.com.cn/s/blog_4fcd1ea30100yh4s.html

http://blog.csdn.net/fenglibing/article/details/8610280

10. 来源

http://www.haodaima.net/art/2483284

windows service 2012: 搭建php环境

之前在windows service 2012中搭建了IIS8.0,对于一个php程序员,如果不把php环境搭建好,那就对不住Jhonse哥的php了,所以就开始动手搭建php环境。

第一步: 下载php压缩包

至于如何下载?请到php官网进行下载,我这里的版本为php5.4.37.

20150210181810

20150210180532

第二步: 上传到windows service 2012

20150210180820

第三步: 在C盘或者其它盘创建php目录,将php压缩包解压到此目录下。

20150210181156

第四步: 配置IIS8.0

1. 创建php.ini文件

将php.ini-development复制为php.ini

20150210183925

2. 配置php.ini文件

至于扩展的开启,自己可以选择性开启自己需要的扩展

20150210184058

3. 查看php版本

20150210191655

4. 配置IIS8.0

采用FastCGI来运行PHP

20150210191858

5. 添加php-CGI.exe

20150210192043

6. FastCGI设置

20150210192322

7. 设置默认文档

20150210192539

第五步: 测试php环境

1. 在默认站点创建index.php

20150210192718

2. 打开站点

提示错误:  phpinfo(): It is not safe to rely on the system’s timezone settings.

20150210193007

3. 设置时区

20150210194506

4. 站点效果

20150210194602

Zend Guard 6.0: 解密php文件

一直以来很少接触Zend Guard加密这块,主要是在网上下了一个php源码,本想有空的时间研究下其代码,结果一看用Zend Guard加密了,所以就开始接触Zend Guard加密这块,所以就开始写了几篇关于Zend Guard的博文。而对于Zend Guard加密的php文件进行解密,网上提供的资料以及软件很多,不过只是针对于php5.2之下的,而php5.3,php5.4的版本进行解密就根本找不到,找到也是在线解密需要money。

刚好我下载的php源码是Zend Guard 6.0加密的,并且对于的php版本是5.3。查找了很多网页,最后终于找到了。所以接着来一篇Zend Guard博文记录下。

说明: 非常感谢提供软件的大神们。

第一: php5.2以及php5.2以下的版本

1. 使用如下软件

20150129030420

2. 查看加密文件代码

此文件加密的版本为php 5.2

20150129030748

3. 使用此软件解密

20150129031012

4. 使用命令行进入到此目录

20150129031154

5. 开始解密

20150129031304

6. 解密成功

20150129031410

7. 说明: 这里提供解密的版本如下:

20150129031535

第二: php5.3版本

1. 使用如下软件

20150129031759

2.  查看加密文件代码

此版本为php5.3

20150129032042

3. 使用此软件解密

20150129032208

4. 打开此软件,选择Xcache解密

20150129032336

5. 选择加密文件,开始解密

20150129032453

6. 解密成功!

至于软件上的其它功能,大家可以下载去玩玩!

20150129032545

PHP扩展开发: 简单的HelloWord

最近摸索CentOS7.0系统的操作比较多,而php对应的扩展部署加载也用的比较多,但是一直都没有想去开发一个属于自己的扩展,刚好最近需要用到这个扩展开发,开发一些小功能,所以就开始着手写一个比较简单的HelloWord扩展来记录下。

第一步: 查看服务器上的PHP版本

说明: 开发php扩展前提是服务器上的apache和php都正常。

20150128004038

第二步: 下载php5.4.16源码

1. 下载php5.4.16,自己到php官网下载即可

20150128004338

2. 上传到/home/jhonse目录下

20150128004439

3. 解压

20150128004604

第三步: 开发php扩展

1. 进入解压好的php文件夹下的ext目录

20150128004752

2. 创建一个php扩展

20150128005017

3. 查看创建好的扩展jExt

20150128005220

4. 修改config.m4文件

说明: dnl 注释

20150128005530

20150128005804

 

5.  编辑扩展头文件php_jExt.h

20150128010925

6. 在头文件中添加HelloWorld方法声明

20150128011233

7. 编辑jExt.c源文件

20150128011445

8. 在jExt.c文件中添加HelloWorld方法。

20150128011734

20150128012043

9. 使用phpize命令把config.m4文件的内容生成configure文件  

20150128012205

报错,需要安装php-devel

20150128012544

20150128012753

10. 生成.so扩展文件

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

20150128013017

make

20150128013156

 

20150128013301

第四步: 调用扩展

调用开发出来的扩展其实跟调用json.so等等扩展是一样。

1. 修改php.ini文件或者在php.d/目录下添加jExt.ini文件

20150128013645

2. 把生成出来的jExt.so复制到php对应的module目录下。

20150128013839

3. 重启httpd服务,并且查看是否已加载次扩展文件。

通过phpinfo()来查看。

20150128014047

4. 调用此模块中的HelloWorld方法

20150128014230

20150128014258

模拟微信公众平台登录

首先我们来看下微信公众平台官网: http://mp.weixin.qq.com

20141028213413

 

然后手动提交登录数据,查看提交的POST数据:

20141028213633

 

密码应该是加密了,我对应的查看下JS代码,看如何进行加密的?

20141028213815

 

由此得出密码是通过MD5进行了加密。

所以我们就可以通过php的curl来进行模拟登陆。

代码如下:

//用户名
$username = "admin@jhonse.com";
//密码
$password = md5("jhonse");

/******模拟微信登入*******/
//cookie保存路径  
$cookie_path = getcwd()."/cookie.txt"; 
//提交地址
$login_url = 'https://mp.weixin.qq.com/cgi-bin/login';  
//post数据
$data = 'f=json&imgcode=&pwd='.$password.'&username='.$username;  
$ch = curl_init($login_url);  
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);  
curl_setopt($ch,CURLOPT_POST,1);  
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_path);  
/*******ssl认证(因为微信公众平台是采用https来传递的)********/
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);  
/**************/
curl_setopt($ch,CURLOPT_REFERER,'https://mp.weixin.qq.com');  
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);  
$content = curl_exec($ch);  
var_dump($content);
curl_close($ch);

 效果:

20141028214453

 

登录成功,并返回跳转地址.以及对应的生成了cookie.txt文件进行保存.

20141028214756

实现网络图片生成本地图片

将网络图片生成本地图片,以及需要满足以下几个条件:

1.  必须登录网站

2.  必须需要有referer

一看到这两个条件,就知道需要用CURL模块来实现此功能,其一需要保持登录之后的cookie值,其二需要添加referer.

根据这两点来实现功能:

1. 先实现存放本地图片的目录路径

/*判断目录是否存在,如果存在,不创建,不存在就创建新目录*/
function make_dir($dir, $index = true) {
	$res = true;
	if(!is_dir($dir)) {
		$res = mkdir($dir, 0777);
		$index && @touch($dir.'/index.html');
	}
	return $res;
}

 2.  获取网路图片数据

require_once 'class/transport.php';
$transport = new transport();
$request = $transport->request($picurl, "", 'GET');

这里我采用了ECSHOP自带的transport类,然后需要此类中use_curl方法,来实现cookie值得保存,以及referer的设置

 /* 基本设置 */
$cookie_path = getcwd()."/cookie.txt";
curl_setopt($curl_session, CURLOPT_FORBID_REUSE, true); // 处理完后,关闭连接,释放资源
curl_setopt($curl_session, CURLOPT_HEADER, true);//结果中包含头部信息
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true);//把结果返回,而非直接输出
curl_setopt($curl_session, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);//采用1.0版的HTTP协议
curl_setopt($curl_session,CURLOPT_REFERER,'referer网址');
curl_setopt($curl_session, CURLOPT_COOKIEFILE, $cookie_path);
curl_setopt($curl_session, CURLOPT_COOKIEJAR, $cookie_path);

说明: 有的网站对于图片有个判断功能,如果referer为自己网站就可以查看图片,而不是的话就提示没有权限打开(403)。

3. 将网络图片数据写入指定目录下

$fp2=@fopen($targetFile,'a');
fwrite($fp2,$request['body']);
fclose($fp2);

 4. 整体方法如下

/*网络图片生成本地图片,返回本地图片地址*/
function savePic($picurl){

	$targetFolder = '/uploads/images';

	$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;

	$targetFile = rtrim($targetPath,'/') . '/';

	if($picurl==''){return '';}

	$ext=strrchr($picurl,'.');

	if($ext!='.gif' && $ext!='.jpg' && $ext!='.png' && $ext!='.jpeg'){return "";}

	$fileFolder = date("Ymd");

	if(make_dir($targetFile.'/'.$fileFolder)){
		$filename = $fileFolder.'/'.date("Ymdhis") . $ext;
	}else{
		$filename = date("Ymdhis") . $ext;
	}
	$targetFile .= $filename;
	$transport = new transport();
	$request = $transport->request($picurl, "", 'GET');
	//文件大小
	$fp2=@fopen($targetFile,'a');
	fwrite($fp2,$request['body']);
	fclose($fp2);
	return $filename;
}

 5. 效果图

20140817051618

php判断文件夹(目录)是否存在,以及创建文件夹(目录)

上传文件的时候,需要对文件进行分组,也就是说创建文件夹(目录),这就需要用到mkdir函数以及is_dir函数。

代码如下:

function make_dir($dir, $index = true) {
	$res = true;
	if(!is_dir($dir)) {
		$res = mkdir($dir, 0777);
		$index && @touch($dir.'/index.html');
	}
	return $res;
}

 

[php] 汉字转换为拼音方法

在项目中需要将中文转换为拼音的功能,在网上一查找到如下方法,经自己测试,能实现此功能!

/**
 * 中文转拼音
 * @param type $_String
 * @param type $_Code
 * @return type
 */
function Pinyin($_String, $_Code = 'UTF8') {
    //GBK页面可改为gb2312,其他随意填写为UTF8
    $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha" .
            "|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|" .
            "cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er" .
            "|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui" .
            "|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang" .
            "|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang" .
            "|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue" .
            "|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne" .
            "|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen" .
            "|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang" .
            "|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|" .
            "she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|" .
            "tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu" .
            "|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you" .
            "|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|" .
            "zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo";
    $_DataValue = "-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990" .
            "|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725" .
            "|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263" .
            "|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003" .
            "|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697" .
            "|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211" .
            "|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922" .
            "|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468" .
            "|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664" .
            "|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407" .
            "|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959" .
            "|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652" .
            "|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369" .
            "|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128" .
            "|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914" .
            "|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645" .
            "|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149" .
            "|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087" .
            "|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658" .
            "|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340" .
            "|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888" .
            "|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585" .
            "|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847" .
            "|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055" .
            "|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780" .
            "|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274" .
            "|-10270|-10262|-10260|-10256|-10254";
    $_TDataKey = explode('|', $_DataKey);
    $_TDataValue = explode('|', $_DataValue);
    $_Data = array_combine($_TDataKey, $_TDataValue);
    arsort($_Data);
    reset($_Data);
    if ($_Code != 'gb2312')
        $_String = _U2_Utf8_Gb($_String);
    $_Res = '';
    for ($i = 0; $i < strlen($_String); $i++) {
        $_P = ord(substr($_String, $i, 1));
        if ($_P > 160) {
            $_Q = ord(substr($_String, ++$i, 1));
            $_P = $_P * 256 + $_Q - 65536;
        }
        $_Res .= _Pinyin($_P, $_Data);
    }
    return preg_replace("/[^a-z0-9]*/", '', $_Res);
}

function _Pinyin($_Num, $_Data) {
    if ($_Num > 0 && $_Num < 160) {
        return chr($_Num);
    } elseif ($_Num < -20319 || $_Num > -10247) {
        return '';
    } else {
        foreach ($_Data as $k => $v) {
            if ($v <= $_Num)
                break;
        }
        return $k;
    }
}

function _U2_Utf8_Gb($_C) {
    $_String = '';
    if ($_C < 0x80) {
        $_String .= $_C;
    } elseif ($_C < 0x800) {
        $_String .= chr(0xC0 | $_C >> 6);
        $_String .= chr(0x80 | $_C & 0x3F);
    } elseif ($_C < 0x10000) {
        $_String .= chr(0xE0 | $_C >> 12);
        $_String .= chr(0x80 | $_C >> 6 & 0x3F);
        $_String .= chr(0x80 | $_C & 0x3F);
    } elseif ($_C < 0x200000) {
        $_String .= chr(0xF0 | $_C >> 18);
        $_String .= chr(0x80 | $_C >> 12 & 0x3F);
        $_String .= chr(0x80 | $_C >> 6 & 0x3F);
        $_String .= chr(0x80 | $_C & 0x3F);
    }
    return iconv('UTF-8', 'GB2312', $_String);
}

[php]配置以及实现mail()函数

之前总是喜欢用phpmailer插件来实现邮件发送,而从来没有真正的在某个项目中采用php自带的mail()函数来实现发送邮件的功能。今天刚好有项目需要,所以通过php自带的mail()函数来实现项目中需要的发送邮件功能!

说明: 在windows环境(windows service 2008)下,需要安装sendmail

第一步: 下载sendmail

下载地址: sendmail

第二步:  解压安装包(最好和php同一个目录下C:\websoft\)

20140504164208

20140504164538

 

第三步: 配置php.ini文件

[mail function]
; For Win32 only.
SMTP = smtp.jhonse.com
smtp_port = 25
; For Win32 only.
sendmail_from = service@jhonse.com
; For Unix only. You may supply arguments as well (default: “sendmail -t -i”).
sendmail_path = "C:\websoft\sendmail\sendmail.exe -t"

 第四步:配置sendmail.ini文件

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging

debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

auth_username=service@jhonse.com
auth_password=123456

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines.  do not enable unless it is required.

pop3_server=
pop3_username=
pop3_password=

; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content

force_sender=service@jhonse.com

; force the sender to always be the following email address
; this will only affect the "RCTP TO" command, it won't modify 
; the "To: " header of the message content

说明:  第一次最好启用debug.log_file,error_logfile,以查看sendmail是否生效。

第五步: 重启apache或者IIS

重启之后,mail()函数就可以正常发送邮件了。

//send email
mail($to, $subject, $message, $headers);

20140504165452