PHP模块开发:第一篇 hello world!

本文介绍如何从零开始创建一个简单的PHP模块,包括生成模块基础结构、实现自定义函数、编译配置及测试等步骤。

在一些必要的场景我们不得不自己开发出自己的本地PHP函数满足一些特定的需求,而新的函数必须存在于PHP模块中。下面将介绍最简单的PHP模块开发:构建自己的say_hello($arg)函数来输出hello world : $arg。

本文档介绍的PHP模块开发仅仅是动动手做做hello world的程度,关于为什么这么做暂时不会介绍太多,更加详细的介绍后续解剖。

php 环境的搭建请参考:。。。

下面通过简单的几个步骤可以完成模块hello world级别的模块:

  1. 生成模块基础结构
  2. 修改模块代码,添加say_hello 函数
  3. 修改编译配置文件
  4. 生成模块共享库
  5. 配置模块,使模块生效
  6. 测试模块

1、生成模块基础

进入php源代码目录下的ext目录。
执行./ext_skel ––extname=sayhello  (我这里的“–”编码有问题请不要直接拷贝)
输出:

[root@myhost ext]# ./ext_skel ––extname=sayhello
  1. Creating directory sayhello
  2. Creating basic files: config.m4 config.w32 .cvsignore sayhello.c php_sayhello.h CREDITS EXPERIMENTAL tests/001.phpt sayhello.php [done].
  3.  
  4. To use your new extension, you will have to execute the following steps:
  5.  
  6. 1.  $ cd ..
  7. 2.  $ vi ext/sayhello/config.m4
  8. 3.  $ ./buildconf
  9. 4.  $ ./configure ––[with|enable]-sayhello
  10. 5.  $ make
  11. 6.  $ ./php -f ext/sayhello/sayhello.php
  12. 7.  $ vi ext/sayhello/sayhello.c
  13. 8.  $ make
  14.  
  15. Repeat steps 3-6 until you are satisfied with ext/sayhello/config.m4 and
  16. step 6 confirms that your module is compiled into PHP. Then, start writing
  17. code and repeat the last two steps as often as necessary.

看到显示输出表示模块基础结构已经生成,我们来看下生成的模块包含哪些文件:

-rw-r–r– 1 root root 2103 Apr 9 05:05 config.m4              //编译配置文件
  1. -rw-r–r– 1 root root  310 Apr  9 05:05 config.w32             //w32编译配置文件
  2. -rw-r–r– 1 root root    8 Apr  9 05:05 CREDITS                //作者信息
  3. -rw-r–r– 1 root root    0 Apr  9 05:05 EXPERIMENTAL           //测试版信息标识
  4. -rw-r–r– 1 root root 2755 Apr  9 05:05 php_sayhello.h         //模块定义头文件
  5. -rw-r–r– 1 root root 5294 Apr  9 05:05 sayhello.c             //模块实现文件
  6. -rw-r–r– 1 root root  508 Apr  9 05:05 sayhello.php           //用来测试模块加载的php文件
  7. drwxr-xr-x 2 root root 4096 Apr  9 05:05 tests                  //测试文件目录

这个时候模块的骨架已经出来了,我们下一步就可以将目标的say_hello()函数加入。

2、实现say_hello()函数

打开模块的php_sayhello.h 文件,增加为php say_hello()准备的c函数定义:
PHP_FUNCTION(say_hello); //php 源代码为模块开放定义了许多宏,习惯了使用还是蛮方便的
增加完以后我们再对PHP_FUNCTION(say_hello)在say_hello.c中增加具体的实现:

PHP_FUNCTION(say_hello){
  1. char *arg = NULL;
  2. int arg_len;
  3.  
  4. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {  //获取php代码的输入参数,方式与scanf差不多
  5. return;
  6. }
  7. zend_printf("hello world : %s",arg)
  8. RETURN_STRINGL(arg, arg_len, 1);
  9. }

现在实现代码也写了,我们还需要将这个函数注册到php本地函数中,需要修改sayhello.c中的sayhello_functions:

zend_function_entry sayhello_functions[] = {
  1. PHP_FE(confirm_sayhello_compiled,    NULL)        /* For testing, remove later. */
  2. PHP_FE(say_hello,    NULL)        //好,现在say_hello函数也注册了
  3. {NULL, NULL, NULL}    /* Must be the last line in sayhello_functions[] */
  4. };

3、修改编译配置文件

打开config.m4,将以下内容前的注释符“dnl”去掉:

dnl PHP_ARG_ENABLE(sayhello, whether to enable sayhello support,
  1. dnl Make sure that the comment is aligned:
  2. dnl [  --enable-sayhello           Enable sayhello support])
  3.  
  4. dnl PHP_SUBST(SAYHELLO_SHARED_LIBADD)

4、编译模块、生成共享库

我这里采用的是动态库的模块生成方式,比静态编译进php速度快多了,方便调试(使用上并非用php的dl()函数加载动态库,后续可以看到)。

进入(cd) sayhello模块文件夹,执行php安装路径bin下的phpize:

[root@myhost sayhello]# /opt/php_server/php/bin/phpize
  1. Configuring for:
  2. PHP Api Version:         20041225
  3. Zend Module Api No:      20060613
  4. Zend Extension Api No:   220060519

此时为模块编译的configure文件已经生成。继续生成Makefile文件:

[root@myhost sayhello]# ./configure –with-php-config=/opt/php_server/php/bin/php-config

……没问题的话是没有错误的

现在可以编译了:

make

代码没有问题的话不会有错的。

编译完,进行模块安装:

[root@myhost sayhello]# make install
Installing shared extensions:     /opt/php_server/php/lib/php/extensions/no-debug-non-zts-20060613/

显示模块已经安装至/php安装路径/extensions/no-debug-non-zts-20060613/ 路径下了。

5、配置模块,使其被加载

打开你的php.ini文件开始修改吧:

扩展路径设置:

修改extension_dir = “/php安装路径/lib/php/extensions/no-debug-non-zts-20060613″ //看看上述的模块安装路径就知道了

增加模块设置:

[sayhello]
extension=sayhello.so

ok 大功告成,重新启动你的php模块把。

6、测试模块

写以下php测试代码执行:

<?php
  1. $a = say_hello("frank");
  2. echo "<br>";
  3. echo $a;
  4. ?>;

打开这个网页后显示:

hello world : frank
frank

成功运行,模块测试通过。
一个简单的hello world级别的php模块已经出来来了,虽然比较简单,许多内容也是知其然,但不知其所以然,不过后续会继续深入分析。

关于MyQEE MyQEE是一个开源、快速、优雅的轻量级PHP框架,支持HMVC模式,建立在PHP5.2基础之上,支持多项目管理开发,数据库内置自动主从分离功能,MySQL支持事务操作功能并且支持自动嵌套功能,多驱动设计灵活适应各种环境。点击访问 [MyQEE入门指引](./manual/guide/zh-cn/starting.md)。   拒绝粗糙不堪、复杂的代码,选择MyQEE,选择为WEB艺术家创造的PHP框架吧。   MyQEE PHP框架的特色 * MyQEE是一套轻量级的框架,但不是简陋的框架,系统具备完善的底层类库和强大的扩展功能设计; * 特有的 [HMVC](./manual/guide/zh-cn/hmvc.md) (分层MVC设计)和多项目支持,开发更灵活; * 支持时下最流行的PHP包管理器 [Composer](http://getcomposer.org/) ,并且可以使用 Composer 安装 MyQEE 提供的官方类库; * 代码一致性设计:例如 `MySQL` 和 `MongoDB` 的查询语句完全不同,但是在 MyQEE 里可以做到实现90%的一致性,你的代码既可以使用在 `MySQL` 的环境里也可以用在 `MongoDB` 上; * 包括`Database`, `Cache`, `HttpClient`, `Session`, `Storage`, `Upload` 等支持多驱动,可以适应不同环境的需求,其中数据库支持 `MySQL`, `MySQLI`, `Mongo`, `SQLite`, `Postgre`,缓存支持 `Memcache`, `File`, `Redis`, `Apc`, `Database`, `SQLite`, `WinCache` 等; * 数据库提供强大的 `QueryBuilder` 功能,可实现同相同程序兼容多种数据库,解决SQL注入隐患和迁移环境后顾之忧; * 云引擎支持:支持SAE和BAE等云引擎,MyQEE网站就运行在SAE上; * 高性能和优雅的代码:经测试 MyQEE 的初始化速度比 Codeigniter 等优秀的轻量级框架还快; * 完备和详细的文档和API支持,更可简单的生成自己的团队文档; * 为团队开发而生,特别提供团队类库功能,多项目设置可以帮助团队成员之间规划独立和共用的代码; * ORM支持,提供了特有的高性能ORM; * 支持 `RESTFul`,支持 [PHPRPC](http://www.phprpc.org/); * 独创5模式运行设计:普通控制器、后台、命令行、系统调用、RESTFul的控制器相互分离,系统更加安全可靠;   安全性 * 系统内置XSS安全过滤; * 防SQL注入,强大的QueryBuilder; * 强制数据类型转换; * 普通控制器、后台、命令行、系统调用、RESTFul 5种运行模式相互隔离,安全更有保障;   MyQEE v3.0 RC2 更新日志: 本次更新在3.0RC1的基础上做了一些完善,修复了一些Bug: 完善文档生成脚本 完善模块化的拆分 数据库增加对 group_concat 的支持,MongoDB数据库驱动支持在group查询中使用distinct查询,修复MongoDB驱动力中查询slave在新的版本里可能导致连接失败的问题 增加 BigInt 类库 日期类库完善 HttpClient 增加upload方法,可实现上传文件功能 完善邮件类库,修复 Email 中上传附件bug,支持收件人姓名 邮件的格式,完善密件抄送的功能 Session 类库优化 Swift Storage 驱动完善,token验证支持v1和v2版本,优化参数传送方式,支持url方式的配置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值