博客
关于我
Linux 下PHP扩展开发系列:二. 一个典型的扩展开发
阅读量:791 次
发布时间:2023-02-01

本文共 1708 字,大约阅读时间需要 5 分钟。

开发PHP扩展:一步步实现ip2long函数的32位支持

作为一名开发者,我在PHP扩展开发方面有着一定的经验。虽然曾经对PHP扩展开发感到复杂,但通过实际操作后发现,其实并不复杂。这篇文章将引导大家从零开始开发一个简单的PHP扩展——重写ip2long函数,使其在32位系统上与64位系统具有一致的返回值范围。

第一步:编译PHP

在开始扩展开发之前,需要先编译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
    1. 编码:编辑myip.c文件,将生成的函数stub进行修改:
    2. 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/

    你可能感兴趣的文章
    leetcode题解46-全排列
    查看>>
    leetcode题解48-旋转图像
    查看>>
    leetcode题解56-合并区间
    查看>>
    leetcode题解66-加一
    查看>>
    leetcode题解70-爬楼梯
    查看>>
    leetcode题解72-编辑距离
    查看>>
    leetcode题解75-颜色分类
    查看>>
    leetcode题解767-重构字符串
    查看>>
    leetcode题解77-子集
    查看>>
    leetcode题解77-组合
    查看>>
    leetcode题解8-盛最多水的容器
    查看>>
    leetcode题解98-验证二叉搜索树
    查看>>
    LeetCode题解【打家劫舍】(中等难度)
    查看>>
    Leetcode题解(二)
    查看>>
    left join on、where后面的条件的区别
    查看>>
    leftjoin多个on条件_MySQL:left join 避坑指南
    查看>>
    legend2---开发日志3(thinkphp的入口目录是public的体现是什么)
    查看>>
    LeNet介绍-ChatGPT4o作答
    查看>>
    LeNet剪枝
    查看>>
    Lenovo E47A Ubuntu闪屏解决办法
    查看>>