本文共 1708 字,大约阅读时间需要 5 分钟。
作为一名开发者,我在PHP扩展开发方面有着一定的经验。虽然曾经对PHP扩展开发感到复杂,但通过实际操作后发现,其实并不复杂。这篇文章将引导大家从零开始开发一个简单的PHP扩展——重写ip2long
函数,使其在32位系统上与64位系统具有一致的返回值范围。
在开始扩展开发之前,需要先编译PHP源码。编译过程大致如下:
tar -zxvf php-5.3.9.tar.gzcd php-5.3.9./configure --prefix=/usr/local/webserver/php --enable-fastcgi --enable-fpm --enable-debugmake installcp /home/soft/php-5.3.9/php.ini-development /usr/local/webserver/php/lib/php.ini
编译完成后,将PHP的路径添加到环境变量中:
vim /root/.bash_profile
在PATH
中添加:
PATH=$PATH:$HOME/bin:/usr/local/webserver/php/bin/
创建PHP扩展的开发环境:
cd /home/soft/php-5.3.9/ext./ext_skel --extname=myip
我们的目标是重写ip2long
函数,使其返回32位有符号整数。定义扩展名为myip
,函数名为ip2long32
。
cd /home/soft/php-5.3.9/ext/myip./ext_skel --proto=myip.pro
myip.c
文件,将生成的函数stub进行修改:PHP_FUNCTION(ip2long32) { char *ip = NULL; int argc = ZEND_NUM_ARGS(); int ip_len; if (zend_parse_parameters(argc TSRMLS_CC, "s", &ip, &ip_len) == FAILURE) { return; } unsigned char ip1, ip2, ip3, ip4; sscanf(ip, "%hhu.%hhu.%hhu.%hhu", &ip1, &ip2, &ip3, &ip4); int32_t ip_int32 = (int32_t)((ip1 << 24) | (ip2 << 16) | (ip3 << 8) | ip4); RETURN_LONG(ip_int32);}
编译扩展代码:
phpize./configure --with-php-config=/usr/local/webserver/php/bin/php-configmake install
将生成的动态库添加到php.ini
中:
vim /usr/local/webserver/php/lib/php.iniextension_dir=/usr/local/webserver/php/lib/php/extensions/extension=myip.so
验证扩展功能:
php -r "var_dump(ip2long32('192.168.1.1'));"
结果应返回32位有符号整数值:
int(-2147483648)
对比原ip2long
函数:
php -r "var_dump(ip2long('192.168.1.1'));"
结果为64位无符号整数:
int(3232235777)
通过以上步骤,我们成功开发并发布了一个新的PHP扩展myip
,并重写了ip2long
函数。在实际开发中,扩展编译过程中可能会遇到各种问题,但只要仔细按照文档和平行编译,都能顺利解决。
转载地址:http://apwfk.baihongyu.com/