• 编写php自定义扩展


    有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。

    这里写图片描述

    1.下载php源码包:
    wget http://tw1.php.net/distributions/php-7.1.9.tar.gz

    1. 解压源码包 , Zend目录里面包含了PHP的Zend Engine源代码,有些函数和宏的定义我们需要在这里面简单地看一下。
      ext目录里面包含了PHP原生的扩展,以及我们开发自己的扩展时可以利用的工具,Linux下使用ext_skel,Windows下使用ext_skel_win32.php

    2. 使用./ext_skel --help
      这里写图片描述

    ./ext_skel --extname=module_name
    • 1

    就可以在ext目录下生成自己的扩展

    config.m4配置文件
    开发PHP扩展,在写C代码之前,要先配置一下这里。我们打开可以看到详细的注释说明,dnl是注释语法。
    如果你的扩展用到了外部依赖,就配置–with-hello选项,否则配置–enable-hello选项,删除这下面3行的del注释
    PHP_ARG_ENABLE(hello, whether to enable hello support,
    Make sure that the comment is aligned:
    [ –enable-hello Enable hello support])
    PHP_ARG_WITH和PHP_ARG_ENABLE这两个宏用来配置configure选项,一个配置需要外部依赖的,另一个配置不需要外部依赖的
    配置好的内容,在后面执行configure –help时可以看到。

    php_hello.h头文件
    类似于C语音的头文件,包含了一些自定义的结构和函数声明,在这个demo中暂时不需要改动

    hello.c代码文件
    真正的逻辑代码都在这个文件中,后面会详细介绍。

    三、编写代码
    好了,到这一步我们终于要开始写代码了,打开hello.c文件。
    整个扩展的入口是zend_module_entry这个结构,具体的定义可以在Zend目录下的zend_modules.h文件中看到,一共有十几个属性,快速跳过,我们暂时只需要”hello world”。

    zend_module_entry hello_module_entry = {
        STANDARD_MODULE_HEADER,
        "hello",
        hello_functions,
        PHP_MINIT(hello),
        PHP_MSHUTDOWN(hello),
        PHP_RINIT(hello),       /* Replace with NULL if there's nothing to do at request start */
        PHP_RSHUTDOWN(hello),   /* Replace with NULL if there's nothing to do at request end */
        PHP_MINFO(hello),
        PHP_HELLO_VERSION,
        STANDARD_MODULE_PROPERTIES
    };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    STANDARD_MODULE_HEADER帮我们实现了前面6个属性
    “hello”是扩展的名字
    hello_functions是扩展包含的全部方法的集合
    后面5个宏分别代表5个扩展特定方法
    PHP_HELLO_VERSION是扩展的版本号,定义在头文件中
    STANDARD_MODULE_PROPERTIES帮我们实现了剩下的属性
    暂时都不需要修改,知道这是一个入口就行。顺着这个入口,我们继续看怎么给扩展添加方法,在hello_functions[]方法数组中已经有了一个示例方法confirm_hello_compiled,我们参考它写我们的方法hello_world

    const zend_function_entry hello_functions[] = {
        PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
        PHP_FE(hello_world,  NULL)
        PHP_FE_END  /* Must be the last line in hello_functions[] */
    };
    • 1
    • 2
    • 3
    • 4
    • 5

    先在扩展的方法数组中添加上hello_world,然后再定义hello_world。找到confirm_hello_compiled方法定义的地方,在它下面依葫芦画瓢,php_printf是Zend Engine中的printf方法。

    PHP_FUNCTION(hello_world)
    {
        php_printf("Hello World!
    ");
        RETURN_TRUE;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最后在编写完c代码之后执行

    phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make && make install
    sudo cp /vagrant/php-7.1.9/ext/hello/modules/hello.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/
    sudo vim /usr/local/php/etc/php.ini  加上extension=hello.so'
    #查看最终的效果
    php -r 'echo hello_world();'
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里写图片描述

    原文:https://blog.csdn.net/b1303110335/article/details/77864786

  • 相关阅读:
    使用物化视图的方式进行表级数据同步示例
    【闲谈】我的大学
    firefox的window.onerror没有详细的出错提示
    完全搞懂傅里叶变换和小波(3)——泰勒公式及其证明
    [VC6 console]调用API获取手机归属地
    灰度直方图及处理“cvQueryHistValue_1D”: 找不到标识符”的问题(上)
    【高级】C++中虚函数机制的实现原理
    jquery小例子
    VBA Promming——入门教程
    Wikidata和SparQL简介
  • 原文地址:https://www.cnblogs.com/showcase/p/13075378.html
Copyright © 2020-2023  润新知