标签 php 下的文章

CentOS6.5安装为PHP安装memcached扩展

PHP环境版本

CentOS6.5的PHP版本为5.6.21通过yum方式安装的, memcache扩展已经通过yum 方式安装好了

首先需要下载并安装libmemcached

因为memcached扩展是基于libevent的事件处理的, 首先需要安装libmemcached
下载地址
解压并安装:

tar zxf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached --with-memcached//注意:--with-memcached这个选项一定要加上
make
make install

注意:如果需要适用sasl, 也可以在安装libmemcahced前安装cyrus-sasl-devel:

yum install cyrus-sasl-devel

安装memcached扩展

首先下载memcached扩展, 下载地址
解压并安装:

tar zxf memcached-2.2.0.tgz
cd zxf memcached-2.2.0
phpize
./configure --with-php-config=/usr/bin/php-config --disable-memcached-sasl --with-libmemcached-dir=/usr/local/libmemcached
make
make test
make install

注意:如果不使用--disable-memcached-sasl安装过程中会提示

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

至此php的memcached扩展安装完毕, 重启php-fpm 即可生效。

关于PHP cURL:SSL certificate error: unable to get local issuer certificate 问题

Window下PHP调用curl接口访问https网址时报错:

<blockquote>

SSL certificate error: unable to get local issuer certificate


</blockquote>

尝试关闭SSL_VERIFY验证,也可以解决问题,但是强烈不建议用该方法:

<blockquote>

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);


</blockquote>

最好的解决办法是添加certificate认证文件并修改PHP.ini配置

认证文件下载地址:https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt|e2e93f9b4d0bd22472e7e8732a70835811|

php.ini 修改如下:

<blockquote>

curl.cainfo="C:/wamp/ca-bundle.crt"
openssl.cafile="C:/wamp/ca-bundle.crt"


</blockquote>

问题彻底解决

关于PHP的Memcache扩展get方法返回数据格式为serialize的问题

问题描述

这两天网站页面中城市名称显示的地方不正常,但是有些地方也正常。调用城市代码用了Memcache缓存,扩展是Memcache。 经过调试后发现调用城市数据的时候有些城市数据返回的是:

string(398) "a:18:{s:2:"id";i:4;s:4:"name";s:6:"重庆";s:5:"alias";s:9:"chongqing";s:4:"bjdx";s:2:"cq";s:4:"type";i:1;s:8:"parentid";i:0;s:8:"haschild";i:1;s:4:"path";s:1:"4";s:6:"domain";s:9:"chongqing";s:5:"quhao";s:3:"023";s:6:"chepai";s:29:"渝A,渝B,渝C,渝F,渝G,渝H";s:5:"color";s:6:"0000FF";s:5:"cs_id";i:35;s:5:"level";i:4;s:5:"class";i:1;s:10:"bdcitycode";i:132;s:6:"status";i:1;s:7:"version";i:1;}"
string(398) "a:18:{s:2:"id";i:4;s:4:"name";s:6:"重庆";s:5:"alias";s:9:"chongqing";s:4:"bjdx";s:2:"cq";s:4:"type";i:1;s:8:"parentid";i:0;s:8:"haschild";i:1;s:4:"path";s:1:"4";s:6:"domain";s:9:"chongqing";s:5:"quhao";s:3:"023";s:6:"chepai";s:29:"渝A,渝B,渝C,渝F,渝G,渝H";s:5:"color";s:6:"0000FF";s:5:"cs_id";i:35;s:5:"level";i:4;s:5:"class";i:1;s:10:"bdcitycode";i:132;s:6:"status";i:1;s:7:"version";i:1;}"

这个问题是memcache->get返回的数据没有经过unserialize处理,就直接返回了,所以导致页面中$array['key']调用的时候显示异常。

目前仍旧无法分析出来具体原因, 先记录下来以后再分析。目前可以确定如下情况:

  • 最近没有升级过服务器和相关服务;
  • 缓存设置的地方是正常的;
  • 只有部分城市出现过问题;
  • 重启过memcached服务, 并不解决问题;
  • PHP版本5.4.45

Linux服务器知识

1、系统选择CentOS 系统,大部分的服务器都是使用CentOS系统。CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS并不包含封闭源代码软件。
2、安装好系统如何配置Web服务器
2.1 升级服务器yum update 平时也要经常更新,及时补上一些已公开的服务器漏洞。
2.2防火墙:CentOS5/6防火墙iptables, CentOS7 防火墙firewalld。防止漏洞攻击
服务器默认都已经安iptables软件
iptables配置和Firewalld配置
只开放需要的端口,白名单的形式开放端口。
2.3 SSH配置、配置端口或者key方式登录。安全入口
ssh配置文件一般是/etc/ssh/sshd_config
2.4 时间同步配置ntpdate 定时同步日期
安装:yum install ntpdate

2.5 磁盘分区及挂载 ext4文件系统,
fdisk dev 命令分区
mkfs.ext4 格式化磁盘分区
mount –t ext4 dev dir 挂载分区
编辑/etc/fstab 文件,防止重启后需要重新挂载
2.6 安装及配置VIM,默认的是vi编辑器。VIM更加强大,可以提高不少效率,还有语法高亮功能。
3、NMP配置
3.1 安装NMP需要的一些基础类库以及编译软件gcc等
yum -y install gcc gcc-c++ glibc automake autoconf libtool make pcre-devel libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel ncurses ncurses-devel
3.2 Nginx
Nginx 编译安装Nginx,官网下载最新稳定版本的Nginx,编译安装。
编译安装命令:
将Nginx加入到Service列表
chkconfig 如何使用
Nginx配置参数【对照实际系统讲解】
3.3 MySQL 编译安装 MySQL5.5.47
1、安装CMAKE (MySQL需要CMAKE方式安装)
2、安装MySQL
3、MySQL主从配置
4、MySQL用户级权限配置[最小权限原则]
4.4 PHP 安装
yum方式安装,安装php-fpm进程池方式管理软件;
php.ini配置
php-fpm.conf配置
4、PHP如何编译安装扩展【如何安装Yaf扩展】
1、安装 php-devel
2、下载Yaf并加压
3、进入加压目录执行
phpize;
./configure -–with-php-config=/php-config-pahth
make
make test
make install
4、修改php.ini

PHP正则表达式之模式修正符

  • i (PCRE_CASELESS) :如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。
/**
*result:
Array()
*/
$str = 'AbbbEEs';
$matches = array();
preg_match('/eE/', $str, $matches);
print_r($matches);

/**
*result:
Array([0] => EE)
*/
$str = 'AbbbEEs';
$matches = array();
preg_match('/ee/i', $str, $matches);
print_r($matches);
  • m (PCRE_MULTILINE):默认情况下,PCRE认为目标字符串是由单行字符组成的(然而实际上他可能由多行),“行首”元字符(^)进匹配字符串的开始位置,而“行末”元字符($)仅匹配字符串末尾,或者最后的换行符(除非设置D修饰符)。这个行为和perl相同。当这个修饰符设置以后,“行首”和“行末”就会匹配目标字符串中任意换行符之后或者之前,还分别匹配目标字符串的最开始和最末尾位置。这等同于perl的/m修饰符。如果目标字符串中没有\n字符,或者模式中没有出现^或$,设置这个修饰符不产生任何影响。
/**
*结果输出:
Array
(
[0] => Array
(
[0] => <p>paragraph1</p>
[1] => <p>paragraph2</p>
[2] => <p>paragraph3</p>
)
)
$str = '<p>paragraph1</p>
<p>paragraph2</p>
<p>paragraph3</p>
';
$matches = array();
preg_match_all('/^<p>.*?<\/p>\r$/m', $str, $matches);//在windows系统中要加\r,因为敲回车输入的是\r\n, 在linux下测试去掉\r
print_r($matches);
*/
  • D (PCRE_DOLLAR_ENDONLY):如果设置这个修饰符,模式中的元字符美元符号($)仅仅匹配字符串的末尾。如果没有设置这个修饰符,当字符串以一个换行符结尾时,美元符号($)还会匹配该换行符(但不会匹配之前的任何换行符). 如果设置了修饰符m, D修饰符不起作用。在perl中没有与此修饰符相同效果的修饰符.
/**
*********在windows系统中要加\r,因为敲回车输入的是\r\n, 在linux下测试请去掉\r**********
*/

/**
**未设置修饰符D时, $会匹配字符串末尾的换行符
*retult:
Array
(
[0] => <p>paragraph3</p>
)
*/
$str = '<p>paragraph3</p>
';
$match = array();
preg_match('/<p>.*?<\/p>\r$/', $str, $matches);
print_r($matches);

/**
**设置修饰符D时, $不会匹配字符串末尾的换行符
*retult:
Array()
*/
$str = '<p>paragraph3</p>
';
$match = array();
preg_match('/<p>.*?<\/p>\r$/D', $str, $matches);
print_r($matches);

/**
**设置修饰符D时, $不会匹配字符串末尾的换行符, 需要指明换行符
*retult:
Array([0] => <p>paragraph3</p>)
*/
$str = '<p>paragraph3</p>
';
$match = array();
preg_match('/<p>.*?<\/p>\r\n$/D', $str, $matches);
print_r($matches);
  • s (PCRE_DOTALL):默认情况下元字符(.)是匹配除换行符(\n)的所有字符,当设置了这个修饰符后,元字符(.)匹配包括换行符的所有字符.
/**
*不设置s时,不能匹配换行符
*result:
Array( [0] => sfs)
*/
$str = 'sfsdf
sfdsa';
$matches = array();
preg_match('/sf.*s/', $str, $matches);
print_r($matches);

/**
*设置s后,能匹配换行符
*result:
Array
(
[0] => sfsdf
sfds
)
*/
$str = 'sfsdf
sfdsa';
$matches = array();
preg_match('/sf.*s/s', $str, $matches);
print_r($matches);
  • U (PCRE_UNGREEDY):这个修饰符扭转了量词的贪婪模式,使量词默认为非贪婪的。通过在量词后紧跟?可以使其成为非贪婪的.
/**
*量词*默认为贪婪模式
*result:
Array
(
[0] => <p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>
)
*/
$str = '<p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>';
$matches = array();
preg_match('/<p>.*<\/p>/', $str, $matches);
print_r($matches);

/**
*修饰符U扭转量词的贪婪模式
*result:
Array
(
[0] => <p>paragraph1</p>
)
*/
$str = '<p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>';
$matches = array();
preg_match('/<p>.*<\/p>/U', $str, $matches);
print_r($matches);

/**
*量词后紧跟?变为非贪婪模式
*result:
Array
(
[0] => <p>paragraph1</p>
)
*/
$str = '<p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>';
$matches = array();
preg_match('/<p>.*?<\/p>/', $str, $matches);
print_r($matches);
  • e (PCRE_REPLACE_EVAL):如果设置了这个修饰符,preg_replace在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php代码评估之行(eval函数方式), 并使用之行结果 作为实际参与替换的字符串. 单引号, 双引号, 反斜线()和NULL字符在 后向引用替换时会被用反斜线转义.
/**
*result:
ggggggggggoooo
*/
$str = 'goooo';
echo preg_replace('/(g)/e', 'str_repeat(\\1, 10)', $str);
  • S: 当一个模式需要多次使用的时候, 为了得到匹配速度的提升, 值得花费一些时间 对其进行一些额外的分析. 如果设置了这个修饰符, 这个额外的分析就会执行. 当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符).
  • A (PCRE_ANCHORED):如果设置了这个修饰符, 模式被强制为"锚定"模式, 也就是说约束匹配使其仅从 目标字符串的开始位置搜索. 这个效果同样可以使用适当的模式构造出来, 并且 这也是perl种实现这种模式的唯一途径.
/**
*以abc开头的字符串可以被匹配到
Array ( [0] => abc )
*/
$str = "abcdeft";
$matches = array();
preg_match('/abc/A', $str, $matches);
print_r($matches);

/**
*不是以abc开头的字符串不能匹配到
Array ( [0] => )
*/
$str = "dabcdeft";
$matches = array();
preg_match('/abc/A', $str, $matches);
print_r($matches);
  • x (PCRE_EXTENDED):如果设置了这个修饰符, 模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略. 这个修饰符 等同于perl中的/x修饰符, 使被编译模式中可以包含注释. 注意: 这仅用于数据字符. 空白字符 还是不能在模式的特殊字符序列中出现, 比如序列(?(引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误. 比如( ?(就会导致错误.).
/**
*因为模式中的空格被忽略, 匹配不到结果:
Array ( [0] => )
*/
$str = "ab cdeft";
$matches = array();
preg_match('/ab c/x', $str, $matches);
print_r($matches);

/**
*匹配到结果:
Array ( [0] => ab c )
*/
$str = "ab cdeft";
$matches = array();
preg_match('/ab c/', $str, $matches);
print_r($matches);
  • X (PCRE_EXTRA):这个修饰符打开了PCRE与perl不兼容的附件功能. 模式中的任意反斜线后就ingen一个 没有特殊含义的字符都会导致一个错误, 以此保留这些字符以保证向后兼容性. 默认 情况下, 在perl中, 反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文. 当前没有其他特性由这个修饰符控制.