Rango会讲解在Linux下从零开始写一个PHP扩展,并编译安装到PHP里,一直到执行扩展中的函数。包含的内容有:

  • 为什么要开发PHP扩展
  • ext_skel工具的使用
  • 修改config.m4
  • phpize的使用
  • 必备工具,autoconf / gcc / make / php5 / php5-dev
  • ZendAPI的使用简介,会介绍几个重要的API

摘自:http://wiki.swoole.com/wiki/page/238.html


学习笔记:

1、安装 Eclipse IDE 插件

(1) 去官网下载 Eclipse 3.7

http://www.eclipse.org/downloads/packages/release/indigo/sr2

(2) 安装 IDE插件

Help -> Install New Software

Work width -> 选择 “Indigo - http://download.eclipse.org/releases/indigo”

Programming Languages ->

选择“C/C++ Development Tools”
选择“PHP Development Tools(PDT) SDK Feature”

(3) 下载PHP源码

http://php.net/releases/

2、安装开发工具(3个)

sudo apt-get install gcc make autoconf
  • gcc:C语言的编译器
  • make:C/C++工程自动构建工具
  • autoconf:检测一些系统环境,以及一些编译参数的设置

3、开发扩展

(1)  重要工具  ./ext/ext_skel

为我们自动创建一个PHP扩展工程的工具/脚本,执行它一下,会打印一些帮助信息

$ ./ext_skel  
./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]
           [--skel=dir] [--full-xml] [--no-help]

  --extname=module   module is the name of your extension
  --proto=file       file contains prototypes of functions to create
  --stubs=file       generate only function stubs in file
  --xml              generate xml documentation to be added to phpdoc-cvs
  --skel=dir         path to the skeleton directory
  --full-xml         generate xml documentation for a self-contained extension
                     (not yet implemented)
  --no-help          don't try to be nice and create comments in the code
                     and helper functions to test if the module compiled

(2) 利用 ext_skel 创建工程

$ ./ext_skel --extname=test
Creating directory test
Creating basic files: config.m4 config.w32 .svnignore test.c php_test.h CREDITS EXPERIMENTAL tests/001.phpt test.php [done].

To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/test/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-test
5.  $ make
6.  $ ./sapi/cli/php -f ext/test/test.php
7.  $ vi ext/test/test.c
8.  $ make

Repeat steps 3-6 until you are satisfied with ext/test/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.

(3) 进入到 扩展 test 目录中

config.m4:autoconf 工具的配置文件
php_test.h:头文件
test.c:C源文件

开发扩展的第一步,就是修改 config.m4,把我们的扩展启用,dnl 是 autoconf 的 注释符,把

dnl PHP_ARG_WITH(test, for test support,
dnl Make sure that the comment is aligned:
dnl [  --with-test             Include test support])

改为

PHP_ARG_WITH(test, for test support,
[  --with-test             Include test support])

表示 启用了这个扩展

(4) 在 扩展test 目录下,执行命令 

$ /opt/software/php/bin/phpize 
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525

PHP根据刚才修改的 config.m4 文件,生成一个 configure 脚本,执行成功后,会看到这个目录就多了一些文件。

我们最主要看的是 configure 这个文件,它是一个Shell脚本,这个脚本帮我们检测一些头文件,一些环境特性方面的东西。

(5) 执行 configure 文件

sudo ./configure  --with-php-config=/opt/software/php/bin/php-config

执行成功后,在扩展目录下会产生一个 Makefile 文件,它是 make 命令的配置文件,

(6) make 根据 Makefile 文件,对 C 源文件进行编译。

$ sudo make

会在扩展的 modules 目录下,生成 test.so 文件

(7) 安装扩展

将刚才编译好的扩展(test.so)安装到PHP的扩增目录

$ sudo make install
Installing shared extensions:     /opt/software/php/lib/php/extensions/no-debug-non-zts-20100525/

(8) 启用扩展

通过如下命令,找到 php.ini 文件位置,

$ /opt/software/php/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /opt/software/php/etc
Loaded Configuration File => /opt/software/php/etc/php.ini

编译 php.ini,添加

extension=test.so

(9) 查看扩展是否被启用

$ /opt/software/php/bin/php -m
[PHP Modules]
bcmath
bz2
...
sysvshm
test
tokenizer
...
zip
zlib

[Zend Modules]
Xdebug

(10) 自己重新写一个函数 test_hello

php_test.h  文件中,增加

PHP_FUNCTION(test_hello);

test.c 文件中,增加

PHP_FUNCTION(test_hello)
{
    long a;
    long b;
    char *c;
    int c_len;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lls", &a, &b, &c, &c_len) == FAILURE) {
        return;
    }

char *str;
    int len = spprintf(&str, 0, "%s: %d\n", c, a * b);

RETURN_STRINGL(str, len, 0);
}

再重新编译、安装  sudo make && make install

(11) 检测 自定义函数 test_hello 是否存在

$ php --rf 'test_hello' 
Exception: Function test_hello() does not exist

提示 函数不存在,说明该函数还没有注册到 Zend引擎中

(12) 注册 test_hello函数到 Zend引擎中

在 test.c 文件中找到如下代码块:

/* {{{ test_functions[]
 *
 * Every user visible function must have an entry in test_functions[].
 */
const zend_function_entry test_functions[] = {
    PHP_FE(confirm_test_compiled,    NULL)        /* For testing, remove later. */
    PHP_FE_END    /* Must be the last line in test_functions[] */
};

增加 test_hello 函数的注册

const zend_function_entry test_functions[] = {
    PHP_FE(test_hello,    NULL)
    PHP_FE(confirm_test_compiled,    NULL)        /* For testing, remove later. */
    PHP_FE_END    /* Must be the last line in test_functions[] */
};

(13) 重新 编译、安装

$ sudo make && make install

(14) 重新 检测函数是否存在

$ php --rf 'test_hello'
Function [ <internal:test> function test_hello ] {
}

OK,函数注册Zend成功!

【视频】从零开始编写第一个PHP扩展的更多相关文章

  1. 从零开始编写自己的C#框架(11)——创建解决方案

    这段时间一直在充电,拜读了园子中大神们的博文(wayfarer的<设计之道>.TerryLee的<.NET设计模式系列文章>.卡奴达摩的<设计模式>还有其他一些零散 ...

  2. 从零开始编写自己的C#框架(2)——开发前准备工作

    没想到写了个前言就受到很多朋友的支持,大家的推荐就是我最大的动力(推荐得我热血沸腾,大家就用推荐来猛砸我吧O^-^O),谢谢大家支持. 其实框架开发大家都知道,不过要想写得通俗点,我个人觉得还是挺吃力 ...

  3. 从零开始编写自己的C#框架(8)——后台管理系统功能设计

    还是老规矩先吐下槽,在规范的开发过程中,这个时候应该是编写总体设计(概要设计)的时候,不过对于中小型项目来说,过于规范的遵守软件工程,编写太多文档也会拉长进度,一般会将它与详细设计合并到一起来处理,所 ...

  4. Windows Phone 8初学者开发—第3部分:编写第一个Windows Phone 8应用程序

    原文 Windows Phone 8初学者开发—第3部分:编写第一个Windows Phone 8应用程序 原文地址: http://channel9.msdn.com/Series/Windows- ...

  5. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  6. 从零开始编写自己的C#框架(25)——网站部署

    导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...

  7. 从零开始编写自己的C#框架(1)——前言

    记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...

  8. 从零开始编写自己的C#框架(20)——框架异常处理及日志记录

    最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...

  9. 从零开始编写自己的C#框架(17)——Web层后端首页

    后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...

随机推荐

  1. 一个典型的MapRuduce实例------webcount(网站统计访客信息)

    统计某一特定网站的某个时辰访客人数 所用版本:hadoop2.6.5 数据样式如下: 111.111.111.111 - - [16/Dec/2012:05:32:50 -0500] "GE ...

  2. 用php怎么改文件名

    php手册:bool rename ( string oldname, string newname [, resource context] )尝试把 oldname 重命名为 newname. 如 ...

  3. C#基础---扩展方法的应用

     最近对扩展方法比较感兴趣,就看了看资料,记录一下扩展方法的几种方法. 一. 扩展方法的基本使用: Note: 1. 扩展方法必须在静态类中, 2 扩展方法必须声明静态方法,3 扩展方法里面不能调用其 ...

  4. &quot;Project facet Java version 1.7 is not supported&quot;的问题解决的办法

    问题描述 在eclipse中,从SVN中检出project代码,拖拽式部署到local server中的时候,报出以下错误: 问题分析 问题产生的原因是,SVN中的代码是采用java 1.7开发编译的 ...

  5. Java - Collection 高效的找出两个List中的不同元素

    如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...

  6. vim 配置语法高亮 行号标示

    配置VIM主要是开启VIM的语法高亮和行号标示,因为默认在用户目录(~)下没有vimrc,所以需要先去复制一个,然后再编辑 cp /etc/vim/vimrc ~/.vimrc vim .vimrc ...

  7. access检测表没有的字段,添加之

    #region 检测是否存在STATE字段,没有就添加 /// <summary> /// 检测是否存在STATE字段,没有就添加 /// </summary> /// < ...

  8. Linux下的Shell编程

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  9. struts2-获取WEB资源

    1.什么是WE资源 2.为什么访问WEB资源 3.如何访问WEB资源 与Servlet API解耦的方式: 使用ActionContext: 实现XxxAware接口 以ApplicationAwar ...

  10. Moving a Subversion Repository to Another Server

    Moving a subversion repository from one server to another, while still preserving all your version h ...