用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 ...
随机推荐
- Libevent源码学习笔记一:event2/event.h
一.libevent标准使用方法: 每个程序使用Libevent必须include <event2/event.h> 头文件,并 传给 -levent 链接器.如果只是想使用主要的eve ...
- yii2.0 在save保存之前的操作(放在模型model文件内)
public function beforeSave($insert){ if(parent::beforeSave($insert)) { if($insert) { } else { } retu ...
- 使用 PHP Curl 做数据中转
流程 收集头部信息 收集请求数据 转换头部信息为 CURL 头部请求格式 使用 Curl 进行转发 收集 HTTP 头信息 function getAllHeaders() { $headers = ...
- .net mvc 路由
Asp.net Mvc之Action如何传多个参数 在Global.asax文件中,默认路由如下. routes.MapRoute( "Default", // 路由名称 &quo ...
- Entity Framework——读写分离
1 实现 CustomDbContext扩展了DbContext,其构造函数带有形式参nameOrConnectionString,可以在使用CustomDbContext时指定数据库连接字符串. D ...
- image_pyradid和自己的一些训练经验总结
这是训练的路锥.警示柱的数据,也就是小物体的.小物体有两个定义,一个是本身像素少,另一个是物体相对于整张图片的比例小 这是把图片缩小到600 proposal_target_layer选取用来训练的p ...
- dropout总结
1.伯努利分布:伯努利分布亦称“零一分布”.“两点分布”.称随机变量X有伯努利分布, 参数为p(0<p<1),如果它分别以概率p和1-p取1和0为值.EX= p,DX=p(1-p). 2. ...
- 关于Git学习推荐
Git学习除了推荐官方网站:https://git-scm.com/之外, 我个人比较推荐初学者或者被动使用者可以学习参考廖雪峰的这个教程:https://www.liaoxuefeng.com/wi ...
- fullCalendar日程管理
//日程安排 function timeTable(id){ var inner = "<div id='calendar'></div>"; $(&quo ...
- 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)
洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...