邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

php7下安装event扩展
1.先安装libevent

wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz

tar -zxvf libevent-2.1.8-stable.tar.gz

cd  libevent-2.1.8-stable

./configure --prefix=/usr/local/libevent-2.1.8

make 

make install


2.再安装event扩展

wget http://pecl.php.net/get/event-2.3.0.tgz

tar -zxvf  event-2.3.0.tgz

cd event-2.3.0

/usr/local/php7/bin/phpize

./configure --with-php-config=/usr/local/php7/bin/php-config --with-event-libevent-dir=/usr/local/libevent-2.1.8/

make 

make install

然后在php.ini中加入 extension=event.so

重启php-fpm即可

php7内核读书笔记-第五章 php的编译与执行
php7内核读书笔记-第五章 php的编译与执行
opline指令-操作数类型
IS_CONST 常量,也称作字面量,比如$a=123,$a="hello",其中123,hello就是字面量
IS_CV 变量,比如$a=123,$b=3+$c,$a,$b,$c就是CV变量
IS_VAR PHP变量,比如$a=time(),time()的返回值就是IS_VAR类型
IS_TMP_VAR 临时变量,或者中间变量 $a="hello_".time(),  "hello".time()就是临时变量
IS_UNUSED 表示操作数没有使用
EXT_TYPE_UNUSED 表示返回值但是没有使用
php7内核读书笔记-第二章 SAPI
php-fpm的worker进程和master进程
worker进程-处理请求
每个worker进程会竞争地Accept请求,接收成功后解析fastcgi,然后执行相应的脚本,处理完成后关闭请求,继续等待新的连接,这个就是一个worker进程的生命周期。
1.等待请求
2.解析请求 
fastcgi请求到达后被worker接收,然后开始接收并解析请求数据,知道request数据完全到达
3.请求初始化
4.执行php脚本
5.关闭请求
master进程-管理进程
三种不同的进程管理模式
1.静态模式static
2.动态模式dynamic  默认
3.按需模式ondemand
信号
1.SIGINT/SIGTERM/SIGQUIT 
退出fpm在master收到退出信号后将向所有的worker进程发布退出信号,通知worker退出,然后master退出
2.SIGUSR1
重新加载日志文件
3.SIGUSR2
重启fpm,首先master也是回向所有的worker进行发出退出信号,等全部worker成功退出后,master会调用execvp()重新启动一个新的fpm,最后旧的master退出
4.SIGCHLD
php7内核读书笔记-第一章 php基础架构
php7的变化
1.抽象语法树
2.Native TLS(线程局部存储)
使用Native TLS来保存线程的资源池,线程独享。
3.指定函数参数、返回值类型
4.zval结构的变化
php7将引用计数转移到了具体的value中。zval结构大小从24字节减少到了16字节
5.异常处理
6.HashTable变化
php中数组类型的内部实现结构。HashTable结构的大小从72字节减小到了56字节,数组元素Bucket结构也从72字节减小到了32字节
7.新的参数解析方式

创建一个简单的php7扩展

Php版本:7.0.0

首先进入php源码 ext 目录下

执行./ext_skel --extname=foobar    //foobar为我要创建的扩展模块

执行完毕后

cd ext/foobar/

vim config.m4


16 dnl PHP_ARG_ENABLE(foobar, whether to enable foobar support,

17 dnl Make sure that the comment is aligned:

18 dn1 [  --enable-foobar           Enable foobar support])


16、17、18行的dn1去掉,修改为


16 PHP_ARG_ENABLE(foobar, whether to enable foobar support,

17 Make sure that the comment is aligned:

18 [  --enable-foobar           Enable foobar support])


然后 vim foobar.c

找到

PHP_FUNCTION(confirm_foobar_compiled)

{

..............

}

在后面添加


PHP_FUNCTION(flyhello)

{

zend_string *strg;

strg = strpprintf(0, "hello world.");

RETURN_STR(strg);

}


然后找到


const zend_function_entry foobar_functions[] = {

     PHP_FE(confirm_foobar_compiled, NULL)       /* For testing, remove later. */

     PHP_FE_END  /* Must be the last line in foobar_functions[] */

 };


修改为


const zend_function_entry foobar_functions[] = {

     PHP_FE(flyhello,NULL)

     PHP_FE(confirm_foobar_compiled, NULL)       /* For testing, remove later. */

     PHP_FE_END  /* Must be the last line in foobar_functions[] */

 };

 


然后重新编译执行后,执行php -m 就可以看到foobar模块

新建php文件,内容<?Php echo flyhello();?>  执行后输出hello world.

php7性能测试

利用apache ab测试php7性能

为了更精准,测试前我先重启了下服务器,请求1000 并发100 下图是php7.0.0

QQ截图20151211091219.png

下图是php5.5.7

QQ截图20151211092816.png


看图一目了然

/server/php-7.0.0/ext/iconv/iconv.c:1505: undefined reference to `libiconv_open'
编译php7时报错
/server/php-7.0.0/ext/iconv/iconv.c:1505: undefined reference to `libiconv_open'

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
.configure --prefix=/usr/local/libiconv
make 
make install

然后再编译php7的时候 加上
./configure --prefix=/alidata/server/php7 \
--with-config-file-path=/alidata/server/php7/etc \
--with-iconv=/usr/local/libiconv \
--with-mcrypt \
--with-mcrypt \
--enable-mysqlnd --with-gd \
.....
linux下升级php7
如果你的服务器里已经装过低版本的php,可以先跳过此步,后面编译php7的时候,如果报错,再根据错误提示,再来安装,如果不嫌麻烦的话

yum install php-mcrypt libmcrypt libmcrypt-devel  libxml2-devel  \
openssl-devel  libcurl-devel \
libjpeg.x86_64 libpng.x86_64 libjpeg-devel.x86_64 \
libpng-devel.x86_64   libjpeg-turbo-devel\
freetype.x86_64 freetype-devel.x86_64 \
libmcrypt-devel   mysql-devel  -y

我的php7是计划装在 /server/php7/目录下,之前的是在/server/php/目录下

下载编译php7
cd /server/
wget http://cn2.php.net/distributions/php-7.0.0.tar.gz
tar zxvf php-7.0.0.tar.gz
cd php-7.0.0

./configure --prefix=/server/php7 \
--with-config-file-path=/server/php7/etc \
--with-mcrypt \
--with-mcrypt \
--enable-mysqlnd --with-gd \
--with-iconv=/usr/local/libiconv \
--with-zlib \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-gettext \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--with-mysqli \
--enable-embedded-mysqli  \
--with-pdo-mysql

make
make install

配置php
cp php.ini-production /server/php7/etc/php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm //是为了和之前的不冲突
chmod +x /etc/init.d/php7-fpm
cp /server/php7/etc/php-fpm.conf.default /server/php7/etc/php-fpm.conf
cp /server/php7/etc/php-fpm.d/www.conf.default /server/php7/etc/php-fpm.d/www.conf
vim /server/php7/etc/php.ini
# 加入
zend_extension=/server/php7/lib/php/extensions/no-debug-non-zts-20151012/opcache.so

vim /server/php7/etc/php-fpm.d/www.conf //修改子进程用户

user = nobody
group = nobody
修改为
user = www
group = www

# 启动
/etc/init.d/php7-fpm start  //如果之前有老的php版本,记得先关掉

我之前的php版本是加入的系统自启动,所有还得修改
vim /etc/rc.d/rc.local
修改为
#/etc/init.d/php-fpm start
/etc/init.d/php7-fpm start
还有之前我吧php命令加入到了环境变量,还需要修改
vim /etc/profile
修改为

export PATH=$PATH:/server/mysql/bin:/server/nginx/sbin:/server/php7/sbin:/server/php7/bin

为了安全最好是去掉头信息  X-Powered-By: PHP/7.*.*
则修改 php.ini 文件 设置 expose_php = Off
vim /server/php7/etc/php.ini
找到 expose_php = On
改为 expose_php = Off



优惠券
广告位-淘宝
最新微语