Home > Article > Backend Development > PHP 底层实现
?
2、 请在local环境,编译PHP,要求:版本5.4, 5.5, 5.6,每个版本要涵盖3个编译版本,包括nts \ zts \ debug
/usr/lib/apache2/modules
/etc/apache2/mods-enabled/
vim php5.load
.编译php的ztf,ntf,debug模式
a.安装apsx工具 apt-get install apache-dev
b.在php源码包下运行 ./configure --prefix=/home/merlin/make_php_version/php-5.4-zts-debug/ --enable-maintainer-zts --with-apxs2=/usr/bin/apxs2 --enable-debug
c.make&&make install 在/usrb/apache2/modules下生成libphp5.so文件
d.在/etc/apache2/mods-enabled下php5.load中添加模块文件.so
编译报错 解决 undefined reference to `libiconv_open'
配置文件:
在安装包中找到php.ini.development 拷贝到安装后的目录下的lib里
每次执行该版本的php 要指定目录
例如:/home/merlin/php_version/php-5.5.21-zts-debug/bin/php -i|grep php.ini
解决方法:
#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
#tar -zxvf libiconv-1.13.1.tar.gz
#cd libiconv-1.13.1
# ./configure --prefix=/usr/local/libiconv
# make
# make install
再检查php,指定 iconv的位置 --with-iconv=/usr/local/libiconv
3、 编写一个简单的PHP扩展,实现3个PHP方法,分别接收参数,并完成结果输出:
a. 数字a与数字b的,加、减、乘、除
b. 字符串a,在字符串b中的重复次数
c. 数组a与数组b的交集与差集
参考 http://www.laruence.com/2009/04/28/719.html
源码包执行
./ext_skel --extname=myfunctions --proto=myfunctions.def
make clean && make && make install
/etc/php5 操作ini 以及移动so文件
类型指定符 | 对应的C类型 | 描述 |
l | long | 符号整数 |
d | double | 浮点数 |
s | char *, int | 二进制字符串,长度 |
b | zend_bool | 逻辑型(1或0) |
r | zval * | 资源(文件指针,数据库连接等) |
a | zval * | 联合数组 |
o | zval * | 任何类型的对象 |
O | zval * | 指定类型的对象。需要提供目标对象的类类型 |
z | zval * | 无任何操作的zval |
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sdd",&str,&str_len,&a,&b) == FAILURE){
return;
}
设置返回值并且结束函数 | 设置返回值 | 宏返回类型和参数 |
RETURN_LONG(l) | RETVAL_LONG(l) | 整数 |
RETURN_BOOL(b) | RETVAL_BOOL(b) | 布尔数(1或0) |
RETURN_NULL() | RETVAL_NULL() | NULL |
RETURN_DOUBLE(d) | RETVAL_DOUBLE(d) | 浮点数 |
RETURN_STRING(s, dup) | RETVAL_STRING(s, dup) | 字符串。如果dup为1,引擎会调用estrdup()重复s,使用拷贝。如果dup为0,就使用s |
RETURN_STRINGL(s, l, dup) | RETVAL_STRINGL(s, l, dup) | 长度为l的字符串值。与上一个宏一样,但因为s的长度被指定,所以速度更快。 |
RETURN_TRUE | RETVAL_TRUE | 返回布尔值true。注意到这个宏没有括号。 |
RETURN_FALSE | RETVAL_FALSE | 返回布尔值false。注意到这个宏没有括号。 |
RETURN_RESOURCE(r) | RETVAL_RESOURCE(r) | 资源句柄。 |
php -i | grep php.ini
1、 请具体叙述PHP的运行机制(细到多深看你心情, 呵);
PHP从下到上是一个4层体系:
版权声明:本文为博主原创文章,未经博主允许不得转载。