PHP扩展开发 第一课 为什么要写扩展及hello world
PHP扩展开发其实很简单.那为什么要扩展开发呢. 这里咱们以实际的案例进行对比.
第一步,进入 php源码包 http://www.php20.com/forum.php?m ... =159&extra=page%3D1 可以从这里下载
第二步,进入源码包的ext目录 .如
|
1
|
cd /lamp_source/php-5.6.23/ext; |
第三步,执行命令
|
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
第四步,按提示 进入扩展目录
|
1
|
cd /lamp_source/php-5.6.23/ext/hw; |
然后vi hw.c 修改代码如下
搜索 PHP_FUNCTION 找到 PHP_FUNCTION(confirm_hw_compiled)这行代码. 在这个函数前增加以下两个函数
|
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找到下面的代码
|
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)
结果 如下
|
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
再然后,配置安装 .代码如下
|
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代码如下
|
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的更多相关文章
- PHP扩展开发:第一个扩展
在上一篇文章<PHP扩展开发:安装PHP>我们已经将开发PHP扩展的PHP环境安装成功,那么接下来采用最简单直接的方式创建第一个扩展. 我们先假设业务场景,是需要有这么一个扩展,提供一个叫 ...
- Chrome浏览器扩展开发系列之十八:扩展的软件国际化chrome.i18n API
i18n是internationalization 的简写,这里将讨论软件国际化的问题.熟悉软件国际化的朋友应该知道,软件国际化要求,页面中所有用户可见的字符串都必须置于资源属性文件中.资源属性文件中 ...
- React Native ios开发第一课
前言 本篇文章的作用在于帮助你快速上手使用React Native编写iOS应用.如果你现在还不太了解React Native是什么以及Facebook为什么要创建React Native,你可以先看 ...
- php开发第一课
开发环境:wampserver IDE工具:sublime2 问题记录: 1.如何避免在php中中文乱码? 在php头部加入:<meta charset="utf-8"> ...
- 我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘
几次想照着课本系统地学习Qt,但我发现还是有详细问题驱动时学习比較快. 于是我给自己设定了这个任务: 读取HMC5843的三轴磁场强度值,计算出角度,并把角度用直观形式显示在图形界面上. 这里面涉及到 ...
- Chrome浏览器扩展开发系列之十九:扩展开发示例
翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...
- Chrome浏览器扩展开发系列之十六:扩展中可用的Chrome浏览器API
除了Chrome浏览器支持的chrome.* API之外,Chrome浏览器扩展还可以使用Chrome浏览器为Web页面或Chrome app提供的APIs.对于Chrome浏览器2支持的API,还可 ...
- PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)
今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...
- 关于PHP扩展开发(收藏)
一.Linux shell命令: ls –lh 查看文件大小 du –a 查看文件及文件夹大小 -------------------------- nginx ------------- ...
随机推荐
- 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 ...
- git合并代码解决冲突
一直测试的我,之前有接触过git命令,但是没有详细的去看这些命令的意思,只是背着在用,今天一时兴起,看到了廖雪峰的git方面的博客<a href="https://www.liaoxu ...
- 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
- SE6 模板字符串详解
SE6引入了模板字符串这样一个概念,让我们从无止尽的+连接字符串中解脱了出来,SE5中也可以在字符串末尾添加\实现,不过模板字符串更加好用和强大. SE6模板字符串是用反撇号(`,即键盘上和~键同一个 ...
- RabbitMQ-Windows单机集群搭建
1.先安装Erlang http://www.erlang.org/downloads,安装完成后,设置环境变量: 变量名:ERLANG_HOME 变量值:D:\Program Files\erl9. ...
- JavaScript sort() 方法详解
定义和用法 sort() 方法用于对数组的元素进行排序. 语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注 ...
- Python基础-注释-变量赋值
一.注释 # 注释 \n 行分隔符 \ 继续上一行 ''' *** ''' 多行注释 二.基本规则 : 分开代码块(组) 头$尾 缩进块 语句代码块 用缩进深度区分 空行 用于分割 ...
- 到底vuex是什么?
Vuex 什么是Vuex? 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 个人理 ...
- Intellij导入子项目时,maven列表子项目灰色不可用---解决方法
导入子项目的module时,左侧project目录中有一个module图标右下角没有小蓝点,maven管理列表该module为灰色(表明未被管理),尝试几次后终于找到解决方案. 贴一张调好过后的图 第 ...
- 基础进阶(一)之HashMap实现原理分析
HashMap实现原理分析 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二 ...