zoukankan      html  css  js  c++  java
  • php扩展开发快速上手

    系统环境CentOS release 6.5 (Final)

    PHP版本php-5.6.27

    扩展开发需要有php环境及php的源代码,我的PHP安装目录/home/zhangxiaomin/study/php5627/,源码目录/home/zhangxiaomin/study/php-5.6.27,

    ln -s /home/zhangxiaomin/study/php5627/bin/php /home/zhangxiaomin/bin/php5.6 做一个软连接用php5.6代替/home/zhangxiaomin/study/php5627/bin/php 

    在源码目录ext下新建myext目录,本次开发的扩展所有代码都放在该目录下[/home/zhangxiaomin/study/php-5.6.27/ext/myext],你需要记住这3个目录,后续我们会频繁用到。如果你是刚开始学习扩展,我建议你弄一个和我一样的目录,虽然这看起来有点傻,但是它可以最好的保证你顺利的编译完成,等你熟悉了整个流程之后,你可以按照自己的习惯规划自己的扩展目录,如果你就想自己安排目录,也没有问题,记得在整个的扩展开发过程中,替换掉所有的目录路径,换成你自己的。

    首先通过一个简单的项目,让你快速构建自己的一个扩展,有一个直观的感受,然后我们再一步步抽丝剥茧深入其中的每一个知识点,在这个过程中,你很多不太理解,没有关系,你可以先照着做。

    创建config.m4文件,该文件告诉 UNIX 构建系统哪些扩展 configure 选项是支持的,你需要哪些扩展库,以及哪些源文件要编译成它的一部分。具体参见http://www.php.net/manual/zh/internals2.buildsys.configunix.php

    1 PHP_ARG_ENABLE(myext, whether to enable Myext support,
    2 [ --enable-myext Enable Myext support])
    3 if test "$PHP_MYEXT" = "yes"; then
    4   PHP_SUBST(MYEXT_SHARED_LIBADD)
    5   PHP_NEW_EXTENSION(myext, myext.c, $ext_shared)
    6 fi

    上面PHP_ARG_ENABLE函数有三个参数,第一个参数是我们的扩展名(不用加引号),第二个参数是当我们运行./configure脚本时显示的内容,最后一个参数则是我们在调用./configure --help时显示的帮助信息。

    3行表示当你编译php时如果加上--enable-myext则加载本扩展

    4行是固定语法,大写扩展名_SHARED_LIBADD[MYEXT_SHARED_LIBADD]

    5行 PHP_NEW_EXTENSION(myext, myext.c, $ext_shared) 第一个参数是扩展名,第二个参数则是扩展的C代码文件,多个文件用空格隔开,比如myext.c myext2.c myext3.c ,第三个参数是固定语法,加上就可以了。

    创建php_myext.h文件

     1 #ifndef PHP_MYEXT_H //常规用法,解决重复require
     2 #define PHP_MYEXT_H 
     3 #define PHP_MYEXT_VERSION "1.0" //定义版本常量
     4 #define PHP_MYEXT_EXTNAME "myext" //定义扩展常量
     5 
     6 PHP_FUNCTION(myext_hello);//函数申明,所有在myext.c文件定义的函数,都会在这个文件里有一个申明
     7 
     8 extern zend_module_entry myext_module_entry;//申明模块注册变量,在myext.c定义
     9 #define phpext_myext_ptr &myext_module_entry
    10 
    11 #endif

    创建myext.c

     1 #ifdef HAVE_CONFIG_H
     2 #include "config.h"
     3 #endif
     4 #include "php.h"//有了这个才能进行扩展开发,Zend的底层类库
     5 #include "php_myext.h"//我们自己定义的头文件
     6 
     7 /*{{{
     8  *
     9  * */
    10 static zend_function_entry myext_functions[] = {
    11     PHP_FE(myext_hello, NULL)//每个函数一行,第一个参数与PHP_FUNCTION(name)的name一样
    12     {NULL, NULL, NULL}//固定语法
    13 };
    14 /*}}}*/
    15 
    16 /*{{{定义扩展模块相关
    17  * */
    18 zend_module_entry myext_module_entry = {
    19 #if ZEND_MODULE_API_NO >= 20010901
    20     STANDARD_MODULE_HEADER,
    21 #endif
    22     "myext",//扩展名称
    23     myext_functions,//zend_function_entry myext_functions 定义好的函数扩展变量
    24     NULL,//MINIT_FUNCTION
    25     NULL,//MSHUTDOWN_FUNCTION
    26     NULL,//RINIT_FUNCTION
    27     NULL,//RSHUTDOWN_FUNCTION
    28     NULL,//MINFO_FUNCTION
    29 #if ZEND_MODULE_API_NO >= 20010901
    30     PHP_MYEXT_VERSION,
    31 #endif
    32     STANDARD_MODULE_PROPERTIES
    33 };
    34 /*}}}*/
    35 
    36 /*{{{
    37  *没有这个就不能在php.ini里面动态加载so
    38  * */
    39 #ifdef COMPILE_DL_MYEXT
    40 ZEND_GET_MODULE(myext)
    41 #endif
    42 /*}}}*/
    43 
    44 PHP_FUNCTION(myext_hello)
    45 {
    46     php_printf("hello you are success");
    47 }

     现在在你的myext目录下,应该有三个文件,config.m4  myext.c  php_myext.h 接着我们开始编译扩展。

    1,/home/zhangxiaomin/study/php5627/bin/phpize 用phpize的工具帮助我们生成各种配置模板文件

    2,/home/zhangxiaomin/study/php-5.6.27/ext/myext/configure  --with-php-config=/home/zhangxiaomin/study/php5627/bin/php-config 生成makefile文件

    3,make

    4,make test

    5,make install 如果不是少了类库少了权限执行路径不对的话,你应该能顺利看到这句话 Installing shared extensions: /home/zhangxiaomin/study/php5627/lib/php/extensions/debug-zts-20131226/ 这就表示我们的扩展库已经编译完成了,接着需要把编译生成的myext.so的库加到php.ini中去

    6,cp -rpf /home/zhangxiaomin/study/php-5.6.27/php.ini-development /home/zhangxiaomin/study/php5627/lib/php.ini 复制一份php.ini文件

    7,编辑/home/zhangxiaomin/study/php5627/lib/php.ini文件

    1 ;搜索extension_dir做以下修改
    2 extension_dir = "/home/zhangxiaomin/study/php5627/lib/php/extensions/debug-zts-20131226/"
    3 
    4 ;在文件末尾添加以下部分
    5 [myext]        
    6 extension=myext.so

    8,php5.6 -m | grep myext 检测扩展是否成功安装,如果你看到了myext,那恭喜你。

    9,在/home/zhangxiaomin/study/php-5.6.27/ext/myext/目录下新建一个test.php的文件,用来运行我们编写的扩展的函数。

    1 <?php
    2 myext_hello();

     10,php5.6 test.php //hello you are success

    至此我们的扩展安装完成了,尽管它看起来很简单,也没有实际作用,只有一个myext_hello的函数,但是我们已经把扩展开发的流程和框架搭建起来了,我们可以在这个基础上增加各种我们想要的功能。

  • 相关阅读:
    接口的幂等性怎么设计?
    python 实现批量 WKT 转 KML
    火星坐标(GCJ02)高精度反算
    GDAL RasterIO 速度测试程序
    linux下 QtCreator 运行不显示 qDebug 输出的问题
    我使用的 clang-format 配置文件
    cephadm 离线安装部署 ceph 集群记录
    解决vcpkg无法交叉编译arm64版本 HDF5 库的问题
    QEMU 虚拟 aarch64(arm64) 记录
    DE-9IM 空间关系模型
  • 原文地址:https://www.cnblogs.com/wuhen781/p/6130509.html
Copyright © 2011-2022 走看看