zoukankan      html  css  js  c++  java
  • PHP扩展开发 第一课 为什么要写扩展及hello world

    PHP扩展开发其实很简单.那为什么要扩展开发呢. 这里咱们以实际的案例进行对比.
    第一步,进入 php源码包   http://www.php20.com/forum.php?m ... =159&extra=page%3D1  可以从这里下载
    第二步,进入源码包的ext目录 .如

    [Shell] 纯文本查看 复制代码
    1
    cd /lamp_source/php-5.6.23/ext;


    第三步,执行命令  

    [Shell] 纯文本查看 复制代码
    1
    ./ext_skel   --extname=hw
    ./ext_skel   --extname=hw Creating directory hw
    Creating basic files: config.m4 config.w32 .gitignore hw.c php_hw.h CREDITS EXPERIMENTAL tests/001.phpt hw.php [done].
    To use your new extension, you will have to execute the following steps:

    1.  $ cd ..
    2.  $ vi ext/hw/config.m4
    3.  $ ./buildconf
    4.  $ ./configure --[with|enable]-hw
    5.  $ make
    6.  $ ./sapi/cli/php -f ext/hw/hw.php
    7.  $ vi ext/hw/hw.c
    8.  $ make


    第四步,按提示   进入扩展目录   

    [Shell] 纯文本查看 复制代码
    1
    cd /lamp_source/php-5.6.23/ext/hw;

    然后vi hw.c  修改代码如下
    搜索 PHP_FUNCTION  找到 PHP_FUNCTION(confirm_hw_compiled)这行代码. 在这个函数前增加以下两个函数

    [C] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    PHP_FUNCTION(add1)
    {
            int i, rs;
            for(i = 0; i < 10000000; i++)
            {
                    rs = i + 1;
            }
            RETURN_LONG(rs);
    }
    PHP_FUNCTION(multiplication1)
    {
            int i,rs;
            for(i = 0;i < 10000000; i++)
            {
                    rs = i * 2;
            }
            RETURN_LONG(rs);
    }

    保存,
    再搜索 PHP_FE找到下面的代码

    [C] 纯文本查看 复制代码
    1
    2
    3
    const zend_function_entry hw_functions[] = {
            PHP_FE(confirm_hw_compiled,     NULL)           /* For testing, remove later. */
            PHP_FE_END      /* Must be the last line in hw_functions[] */



    中间加上  
            PHP_FE(add1,NULL)
            PHP_FE(multiplication1,NULL)

    结果 如下

    [C] 纯文本查看 复制代码
    1
    2
    3
    4
    5
    const zend_function_entry hw_functions[] = {
            PHP_FE(confirm_hw_compiled,     NULL)           /* For testing, remove later. */
            PHP_FE(add1,NULL)
            PHP_FE(multiplication1,NULL)
            PHP_FE_END      /* Must be the last line in hw_functions[] */




    然后执行phpize 比如您的php路径是
    sh-3.2# /usr/local/php-5.6.23/  则是  /usr/local/php-5.6.23/bin/phpize
    出现以下则正常

    Configuring for:
    PHP Api Version:         20131106
    Zend Module Api No:      20131226
    Zend Extension Api No:   220131226


    再然后,配置安装 .代码如下

    [Shell] 纯文本查看 复制代码
    1
    ./configure --with-php-config=/usr/local/php-5.6.23/bin/php-config

    要注意php路径.跟上面的phpize是同一个目录   回车如果不报错则正常.
    再输入两个命令 make && make install 如果看到下面的代码说明正常

    Installing shared extensions:     /usr/local/php-5.6.23/lib/php/extensions/no-debug-non-zts-20131226/


    接下来 修改一下php.ini  增加extension=hw.so
    sh-3.2# vi /usr/local/php-5.6.23/php.ini  搜索 extension 可以找的到

    重启php-fpm  然后phpinfo()查看一下.如图

    第五步.测试扩展到底有个毛用?php代码如下

    [PHP] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php
    function add()//加法函数
    {
        $rs = 0;
        for ($i = 0 ; $i < 10000000; $i++)
        {
            $rs = $i +1;
        }
        return $rs;
    }
    function multiplication()//乘法函数
    {
        $rs = 0;
        for ($i = 0 ; $i < 10000000; $i++)
        {
            $rs = $i * 2;
        }
        return $rs;
    }
    $time = microtime(true);//取微秒
    echo add();//运行函数
    $add1 = microtime(true) - $time;//计算函数占用时间.这是php的加法函数时间,add1是结果
    echo 'add time:' . $add1 . '<hr/>';//现实出来
    $time = microtime(true);//同上.计算php的乘法时间
    echo multiplication();
    $multiplication1 = microtime(true) - $time;//结果
    echo 'multiplication time:' . $multiplication1 . '<hr/>';
    $time = microtime(true);//取扩展前的时间
    echo add1();//扩展函数
    $add2 = microtime(true) - $time;//结果
    echo 'ext add time:' . $add2 . '<hr/>';
    $time = microtime(true);
    echo multiplication1();//相同.这是扩展乘法
    $multiplication2 = microtime(true) - $time;
    echo 'ext multiplication time:' . $multiplication2 . '<hr/>';//结果
     
    echo 'add1 / add2 = '  . ($add1 / $add2) . '<hr>';//扩展是php的多少倍
    echo 'multiplication1 / multiplication2 = '  . ($multiplication1 / $multiplication2) . '<hr>';





    最后查看结果....

    加法大约是126万倍(平均在60-120万倍) 乘法大约是126万倍(平均在100万倍以上)

  • 相关阅读:
    mongodb分片
    mongodb读写分离的一些选项的理解
    mongodb管理副本集(持续更新中)
    mongodb配置副本集(多台服务器间的副本集搭建) replica[ˈrɛplɪkə]
    mongodb副本集的基础概念和各种机制
    mongodb的查询
    mongodb文档的CRUD
    SQLServer2008数据库连接error40错误
    Did you forget about DBModel.InitializeModel the model [AAAdm] ?
    ERP中通过EDI导入资料的时候出现【Microsoft Office Excel不能访问文件‘C:WindowsTEMP433....’
  • 原文地址:https://www.cnblogs.com/ghjbk/p/6635668.html
Copyright © 2011-2022 走看看