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万倍以上)

PHP扩展开发 第一课 为什么要写扩展及hello world的更多相关文章

  1. PHP扩展开发:第一个扩展

    在上一篇文章<PHP扩展开发:安装PHP>我们已经将开发PHP扩展的PHP环境安装成功,那么接下来采用最简单直接的方式创建第一个扩展. 我们先假设业务场景,是需要有这么一个扩展,提供一个叫 ...

  2. Chrome浏览器扩展开发系列之十八:扩展的软件国际化chrome.i18n API

    i18n是internationalization 的简写,这里将讨论软件国际化的问题.熟悉软件国际化的朋友应该知道,软件国际化要求,页面中所有用户可见的字符串都必须置于资源属性文件中.资源属性文件中 ...

  3. React Native ios开发第一课

    前言 本篇文章的作用在于帮助你快速上手使用React Native编写iOS应用.如果你现在还不太了解React Native是什么以及Facebook为什么要创建React Native,你可以先看 ...

  4. php开发第一课

    开发环境:wampserver IDE工具:sublime2 问题记录: 1.如何避免在php中中文乱码? 在php头部加入:<meta charset="utf-8"> ...

  5. 我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘

    几次想照着课本系统地学习Qt,但我发现还是有详细问题驱动时学习比較快. 于是我给自己设定了这个任务: 读取HMC5843的三轴磁场强度值,计算出角度,并把角度用直观形式显示在图形界面上. 这里面涉及到 ...

  6. Chrome浏览器扩展开发系列之十九:扩展开发示例

    翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...

  7. Chrome浏览器扩展开发系列之十六:扩展中可用的Chrome浏览器API

    除了Chrome浏览器支持的chrome.* API之外,Chrome浏览器扩展还可以使用Chrome浏览器为Web页面或Chrome app提供的APIs.对于Chrome浏览器2支持的API,还可 ...

  8. PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)

    今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...

  9. 关于PHP扩展开发(收藏)

    一.Linux shell命令: ls –lh    查看文件大小 du –a    查看文件及文件夹大小 -------------------------- nginx ------------- ...

随机推荐

  1. LeetCode 548. Split Array with Equal Sum (分割数组使得子数组的和都相同)$

    Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies fol ...

  2. git合并代码解决冲突

    一直测试的我,之前有接触过git命令,但是没有详细的去看这些命令的意思,只是背着在用,今天一时兴起,看到了廖雪峰的git方面的博客<a href="https://www.liaoxu ...

  3. 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  4. SE6 模板字符串详解

    SE6引入了模板字符串这样一个概念,让我们从无止尽的+连接字符串中解脱了出来,SE5中也可以在字符串末尾添加\实现,不过模板字符串更加好用和强大. SE6模板字符串是用反撇号(`,即键盘上和~键同一个 ...

  5. RabbitMQ-Windows单机集群搭建

    1.先安装Erlang http://www.erlang.org/downloads,安装完成后,设置环境变量: 变量名:ERLANG_HOME 变量值:D:\Program Files\erl9. ...

  6. JavaScript sort() 方法详解

    定义和用法 sort() 方法用于对数组的元素进行排序. 语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注 ...

  7. Python基础-注释-变量赋值

    一.注释 # 注释 \n 行分隔符 \ 继续上一行 '''   *** ''' 多行注释 二.基本规则 : 分开代码块(组)   头$尾 缩进块  语句代码块  用缩进深度区分 空行     用于分割 ...

  8. 到底vuex是什么?

    Vuex 什么是Vuex? 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 个人理 ...

  9. Intellij导入子项目时,maven列表子项目灰色不可用---解决方法

    导入子项目的module时,左侧project目录中有一个module图标右下角没有小蓝点,maven管理列表该module为灰色(表明未被管理),尝试几次后终于找到解决方案. 贴一张调好过后的图 第 ...

  10. 基础进阶(一)之HashMap实现原理分析

    HashMap实现原理分析 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二 ...