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 59. Spiral Matrix II (螺旋矩阵之二)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- sublime text3 开发必备插件
1,Package Control 通俗易懂地说,这个是你在完成安装SublimeText后必须安装的东西.你问为什么?因为有了这个特殊的"插件包",你可以很容易地安装.升级.删除 ...
- 老大哥在看着你!我国部署超2000万个AI监控系统
原文:Big brother is watching you! China installs 'the world's most advanced video surveillance system' ...
- Linux学习(十七)压缩与打包
一.关于打包和压缩 打包和压缩的最大意义在于减少文件传输中需要的流量.打包的方式大概有tar命令,zip命令.压缩的方式有gzip,bzip2,xz.tar命令可以通过参数将压缩和打包在一起执行. 二 ...
- empty()和remove()的区别
这两个都是删除元素,但是两者还是有区别的. remove()这个方法呢是删除被选元素的所有文本和子元素,当然包括被选元素自己. 而empty()呢,被选元素自己是不会被删除的. 比如: <div ...
- backface-visibility 3D修复
backface-visibility 是作用于 3D transform 时候 默认是 backface-visibility: hidden; 当一个元素3D变换的时候,会立即看到背 ...
- JAVA基础-JDBC(一)
一.JDBC的简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,由与各种数据库都有着一套自己的规范,JAVA对其操 ...
- C#基本功之委托和事件
定义:委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联 目的:方法声明和方法实现的分离,使得程序更容易扩展 一 ...
- [array] leetCode-4-Median of Two Sorted Arrays-Hard
leetCode-4-Median of Two Sorted Arrays-Hard descrition There are two sorted arrays nums1 and nums2 o ...
- 一起写框架-Ioc内核容器的实现-基础API的定义(三)
Ioc内核要解决的问题 1.被调用方,在程序启动时就要创建好对象,放在一个容器里面. 2.调用方使用一个接口或类的引用(不用使用new),就可以创建获得对象. 解决这个两个问题的思路 1.定义一个对象 ...