用ext_skel,实现一个PHP扩展,添加到PHP并调用
1 创建函数定义文件
#mkdir /home/phpext
#vi mydefined.skel string get_text(string str)
2 根据README所提供的信息创建预定义文件和扩展的开发框架包
进入到PHP源码包,即php-5.*/ext/内 运行下面代码 将会生成hello文件夹
# ./ext_skel --extname=hello --proto=/home/phpext/mydefined.skel
3 进入hello文件夹 修改hello文件内,config.m4、php_hello.h、hello.c三个文件
[root@localhost hello]#vi config.m4
dnl PHP_ARG_WITH(hello, for hello support,
dnl Make sure that the comment is aligned:
dnl [ --with-hello Include hello support]) dnl Otherwise use enable: 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(根据实际情况二选一,第一种是指扩展需第三方库支持,我这去掉第二个的注释dnl)
[root@localhost hello]#vi php_hello.h
/*PHP_FUNCTION(confirm_hello_compiled);*/ /* For testing, remove later. */
PHP_FUNCTION(get_text);
注释掉默认声明的PHP函数 confirm_hello_compiled
[root@localhost hello]# vi hello.c
const zend_function_entry hello_functions[] = {
/* PHP_FE(confirm_hello_compiled, NULL)*/ /* For testing, remove later. */
PHP_FE(get_text, NULL)
PHP_FE_END /* Must be the last line in hello_functions[] */
};
/*PHP_FUNCTION(confirm_hello_compiled)*/
PHP_FUNCTION(get_text)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
len = spprintf(&strg, , "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "hello", arg);
RETURN_STRINGL(strg, len, );
}
注释掉默认声明的PHP函数 confirm_hello_compiled 并鸠占鹊巢 用get_text 代替confirm_hello_compiled (主要使用里面现成的打印内容;可以自己写要执行的内容实现getext函数 需熟悉C)
zend_parse_parameters
第一个参数是传递给函数的参数个数。通常的做法是传给它ZEND_NUM_ARGS()。这是一个表示传递给函数参数总个数的宏。第二个参数是为了线程安全,总是传递TSRMLS_CC宏,后面会讲到。第三个参数是一个字符串,指定了函数期望的参数类型,后面紧跟着需要随参数值更新的变量列表。因为PHP采用松散的变量定义和动态的类型判断,这样做就使得把不同类型的参数转化为期望的类型成为可能。例如,如果用户传递一个整数变量,可函数需要一个浮点数,那么zend_parse_parameters()就会自动地把整数转换为相应的浮点数。如果实际值无法转换成期望类型(比如整形到数组形),会触发一个警告。
4 配置、编译、安装phpext
[root@localhost hello]# /usr/local/php/bin/phpize
[root@localhost hello]#./configure --with-php-config=/usr/local/php/bin/php-config
[root@localhost hello]#make && make install
如果一切正常,将在对应的文件夹内将多出一个叫hello.so的文件,具体地址编译后会返回 在php.ini中添加扩展并重启 如
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-/hello.so
查看是否安装成功
#php -m|grep hello
hello
[root@localhost hello]# php -r "echo get_text('hello');"
Congratulations! You have successfully modified ext/hello/config.m4. Module hello is now compiled into PHP.
盗用别人的一张图

详细可参考:http://www.laruence.com/2009/04/28/719.html
下一步学习C 任重道远...
用ext_skel,实现一个PHP扩展,添加到PHP并调用的更多相关文章
- 给 string 添加一个 GetInputStream 扩展方法
有时候,我们须要读取一些数据,而无论这数据来源于磁盘上的数据文件,还是来源于网络上的数据.于是.就有了以下的 StringExtensions.cs: using System; using Syst ...
- 【视频】从零开始编写第一个PHP扩展
Rango会讲解在Linux下从零开始写一个PHP扩展,并编译安装到PHP里,一直到执行扩展中的函数.包含的内容有: 为什么要开发PHP扩展 ext_skel工具的使用 修改config.m4 php ...
- [php-src]一个Php扩展的结构
内容均以php5.6.14为例. 要拥有一个PHP扩展的架子,使用源码中准备好的 /ext/ext_skel 工具,可以生成一个可运行的扩展骨架. 不加选项运行 ./ext_skel,可查看所有可用选 ...
- 如何通过写一个chrome扩展启动本地程序
@(编程) [toc] 本文介绍如何利用Chrome 的插件, 从我们的一个网站中启动一个我们的本地程序.本文的环境是windows10,本文的例子是通过点击网页上的一个button,调用本地的wor ...
- 我的第一个php扩展
一.进入php源码包,找到ext文件夹 cd /owndata/software/php-5.4.13/ext 文件夹下放的都是php的相关扩展模块 二.生成自己的扩展文件夹和相关文件 php支持开发 ...
- 从头认识Spring-3.8 简单的AOP日志实现(注解版)-扩展添加检查订单功能,以便记录并检測输入的參数
这一章节我们讨论一下扩展添加检查订单功能,以便记录并检測输入的參数. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03 ...
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...
- 教你如何写一个 Yii2 扩展
前言 把一系列相关联的功能使用模块开发,好处多多,维护起来很方便,模块还可以单独发布出去,让下一个项目之间使用,真是方便. 下面我就写一个开发扩展的简单教程. Gii gii 自带帮助我们生成一个基本 ...
- 快速开发一个PHP扩展
快速开发一个PHP扩展 作者:heiyeluren时间:2008-12-5博客:http://blog.csdn.net/heiyeshuwu 本文通过非常快速的方式讲解了如何制作一个PHP 5.2 ...
- 从零开始创建一个 PHP 扩展
创建一个扩展的基本步骤都有哪些.示例中,我们将实现如下功能: <?phpecho say();?> 输出内容: $ php ./test.php$ hello word 在扩展中实现一个s ...
随机推荐
- Cacti监控mysql数据库server实现过程
前言:cactiserver端安装请參考:http://blog.csdn.net/mchdba/article/details/27120605 1 先在cactiserver端安装mysql模板 ...
- LeNet 分类 FashionMNIST
import mxnet as mx from mxnet import autograd, gluon, init, nd from mxnet.gluon import loss as gloss ...
- webpack的正确安装方式
webpack是基于node开发的模块打包工具,所以他本质上是由node实现的. 我们要保持node版本尽量的新,另一个要保持webpack版本尽量的新,高版本的webpack会利用新版本中的一些特性 ...
- PHP------数组的遍历
echo current($attr); //取当前元素的value值 echo key($attr); //取当前元素的key next($attr); //将数组里面的指针指向下一个(向下移)pr ...
- tp3.2替换模板中如果需要替换的图片在css样式表中怎么办?
因为标签中的 style 定义的样式可直接覆盖 css样式表中定义的样式,所以可以在要替换的标签中用 style 直接定义样式,具体代码如下: <div class="aboutbg& ...
- Collections.synchronizedList线程安全性陷阱
摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedLi ...
- get-pip.py 安装
http://www.pip-installer.org/en/latest/installing.html$ curl http://pypi.python.org/packages/source/ ...
- hadoop-1.2.1运行过程中遇到的问题
在hadoop-1.2.1中运行所遇到的问题: 2014-11-14 22:43:42 在服务器上运行hadoop-1.2.1中的datanode,出现了内存占用过大,导致ssh登陆出现如下问题 ...
- careercup-扩展性和存储限制10.4
题目 有一个数组,里面的数在1到N之间,N最大为32000.数组中可能有重复的元素(即有的元素 存在2份),你并不知道N是多少.给你4KB的内存,你怎么把数组中重复的元素打印出来. 解答 我们有4KB ...
- chromium之message_pump_win之一
写了22篇博文,终于到这里了———— MessagePumpWin!!! MessagePumpWin这个类还是挺复杂的,可以分成好几部分.接下来分块分析 从介绍看,MessagePumpWin 是M ...