免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 17427 | 回复: 43
打印 上一主题 下一主题

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-19 13:15 |只看该作者 |倒序浏览
背景:网上银行支付系统,需要采用数字签名;
         网上银行服务提供方,提供了C语言的验证演示程序;

前提:我目前的运作环境
       :php4.3.11 + Apache2

需求:开发网上银行数字签名的模块。
         不改动原有的PHPBIN,也就是不能从新安装PHP

参考:http://www.php.net/manual/zh/zend.php


因为安全原因,我这里不能列出实际的数字验证部分的代码。
但是所给出的代码是可以通过的。
为了防止以后有这种事情忘记了,所以在这里记录下来。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2005-05-19 13:18 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

首先,你要作如下准备。

1、你的系统已经安装了PHP4.3.11

2、你的PHP4.3.11的源代码还存在。
     如果不存在???
     没关系,查看phpinfo()里面的Configure Command
     到www.php.net下载PHP4.3.11,解压到某个目录
     到解压的目录之中,运行Configure Command

3、这样子就做好了基本的环境准备了

附加:
当然,GCC、vi什么的你预先准备哦,我所说的只是php的部分的

简写说明:
phpbin表示已经安装好的php
phpsrc表示愿代码的php

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2005-05-19 13:21 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

基本模块框架建立:

假设我们的模块叫做:
CheckInfo


  1. cd phpsrc/ext
  2. ./ext_skel --extname=CheckInfo
  3. #语法:./ext_skel --extname=模块名称
  4. cd CheckInfo
  5. ls -l
复制代码


现在可以看到,模块的基本框架相关的文件已经建立了

  1. config.m4 编译相关的配置
  2. php_CheckInfo.h PHP定义CHeckInfo模块的头文件
  3. CheckInfo.c CheckInfo模块的实际代码文件
  4. CheckInfo.php 这个是一个PHP测试文件,看是否可以调用这个模块
复制代码


这里需要提前说明的一点,CheckInfo.php里面采用了dl()这个函数,这个要求你的PHP设置可以调用,并且extension目录设置正确。
还有,我使用的Apache2工作在worker模式,他提示我说在多线程模式下不可用dl(),应该使用extension=CheckInfo.so



      还有一点说明,你执行了上面的扩展模块生成工具之后,会提示你几个步骤,但是我们不那么做。
     当然,你可以按照那个做一下子也可以的。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
4 [报告]
发表于 2005-05-19 13:37 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

然后修改编译配置文件,打开config.m4,你从最开始可以看到:

  1. dnl $Id$
  2. dnl config.m4 for extension CheckInfo

  3. dnl Comments in this file start with the string 'dnl'.
  4. dnl Remove where necessary. This file will not work
  5. dnl without editing.

  6. dnl If your extension references something external, use with:

  7. dnl PHP_ARG_WITH(CheckInfo, for CheckInfo support,
  8. dnl Make sure that the comment is aligned:
  9. dnl [  --with-CheckInfo             Include CheckInfo support])

  10. dnl Otherwise use enable:
  11. dnl 另外,你可以使用enable参数,来加载模块

  12. dnl PHP_ARG_ENABLE(CheckInfo, whether to enable CheckInfo support,
  13. dnl Make sure that the comment is aligned:
  14. dnl [  --enable-CheckInfo           Enable CheckInfo support])

复制代码


在这里,dnl表示注释,加了dnl的部分不会被执行。
在php编译的时候,加载某一模块可以使用
--with-modulename或者--enable-modulename
如果采用--with-modulename的模式,那么就修改

  1. dnl PHP_ARG_WITH(CheckInfo, for CheckInfo support,
  2. dnl Make sure that the comment is aligned:
  3. dnl [  --with-CheckInfo             Include CheckInfo support])
复制代码



  1. PHP_ARG_WITH(CheckInfo, for CheckInfo support,
  2. Make sure that the comment is aligned:
  3. [  --with-CheckInfo             Include CheckInfo support])
复制代码


反之亦然,如果要采用--enable-modulename的模式,就修改

  1. dnl PHP_ARG_ENABLE(CheckInfo, whether to enable CheckInfo support,
  2. dnl Make sure that the comment is aligned:
  3. dnl [  --enable-CheckInfo           Enable CheckInfo support])
复制代码



  1. PHP_ARG_ENABLE(CheckInfo, whether to enable CheckInfo support,
  2. Make sure that the comment is aligned:
  3. [  --enable-CheckInfo           Enable CheckInfo support])
复制代码


如果你的和这个不同,应该可以根据英文的意思来设定的。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
5 [报告]
发表于 2005-05-19 13:39 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

然后,配置zend扩展模块api,这个时候很简单,执行一条命令

  1. phpbin/phpize
复制代码

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
6 [报告]
发表于 2005-05-19 13:47 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

然后,这行configure进行编译配置,这个也很简单

  1.     ./configure --[with|enable]-CheckInfo
  2.     #[with|enable]根据前面的config.m4设置来选择
复制代码


这个就可以配置编译参数了。

这里有一点说明,因为我需要加载openssl的链接库,所以我加了一个参数,命令修改为:

  1.     ./configure --[with|enable]-CheckInfo LDFLAGS="-lcrypto"
复制代码


有时候,这里还需要一个参数:
如果提示:
  1. configure: error: Cannot find php-config. Please use --with-php-config=PATH
复制代码

你可以这么做:

  1.     ./configure --[with|enable]-CheckInfo --with-php-config=phpbin/php-config
复制代码

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
7 [报告]
发表于 2005-05-19 14:01 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

然后编译测试一下子:

  1. make
  2. ......
  3. See any operating system documentation about shared libraries for
  4. more information, such as the ld(1) and ld.so(8) manual pages.
  5. ----------------------------------------------------------------------

  6. Build complete.
  7. (It is safe to ignore warnings about tempnam and tmpnam).
  8. ...
  9. ls -l modules
复制代码


如果没有错误,看到了CheckInfo.so,那么说明我们可以开始这个模块的实际功能开发了。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
8 [报告]
发表于 2005-05-19 14:17 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

因为我现在正在做,所以边做边写。

现在我们要开始写模块了哦。

模块的主要信息,与php_CheckInfo.h和CheckInfo.c有关。

php_CheckInfo是头文件信息,php需要从里面获取当前模块的资料,例如版本,所包含的函数,例如里面包含了一个测试用的函数:
  1. PHP_FUNCTION(confirm_CheckInfo_compile);
复制代码


如果我们要添加一个自己的函数,那么可以在这个下面添加自己的定义:
  1. PHP_FUNCTION(nihao);
复制代码

  1. PHP_FUNCTION(dajiahao);
复制代码


为什么可以由多个?
因为我们的一个模块,是可以提供多个功能函数的


还有一点注意,函数名称都用小写好了。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
9 [报告]
发表于 2005-05-19 15:00 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

定义了自己的函数之后,就需要编写函数的实际功能了。

函数的实际功能,在CheckInfo.c里面写出来。

首先我们需要定义在前面的头文件里面所定义的函数的入口。
好在康佳已经给了我们基本的定义,按照要求添加就可以了。
打开CheckInfo.c,你可以找到:
  1. static function_entry hello_functions[] = {
复制代码

这个地方定义了我们的函数入口,要添加我们在前面定义的:

  1. PHP_FE(nihao, NULL)
  2. PHP_FE(dajiahao, NULL)
复制代码


定义了函数入口之后,就可以写函数的实际代码了。

你可以在最后添加:

  1. PHP_FUNCTION(nihao)
  2. {
  3.     RETURN_STRING("Nihao , wo shi php ext CheckInfo", 1);
  4. }
复制代码

暂时我们使用返回字符串来演示,实际上可以返回其他的类型,或者直接输出。





现在我们要来测试一下子:
首先:

  1. phpbin/bin/php -r "phpinfo();" | grep "php.ini"
复制代码

将会显示:

  1. Configuration File (php.ini) Path =>; phpbin/etc/php.ini
复制代码

这个phpbin/etc/php.ini表示你的php.ini的位置
然后你要打开这个php.ini,设置好extensions的dir的位置,我的设置在:phpbin/extensions/
然后设置启用我们的扩展模块:
  1. extension=CheckInfo.so
复制代码


哦,我们的模块还没有生成最新的,那我们做一下子

  1. make
  2. copy modules/CHeckInfo.so phpbin/extensions/
  3. phpbin/bin/php -r "echo nihao();"
复制代码


如果这个时候出现了:
  1. Nihao , wo shi php ext CheckInfo
复制代码


那就说明,我们成功了。
如果没有成功,它是会告诉我们错误的。

为什么我们要使用“phpbin/bin/php -r "echo nihao();"”来进行测试???
因为我们可以在命令行直接输入我们的代码,免得还要不断从新启动服务器来调试。
当然,我们因为实在调试阶段,如果代码都写好了,调试通过了,直接加载到运行的服务器的PHP之中,就不用不断从新启动了。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
10 [报告]
发表于 2005-05-19 15:08 |只看该作者

PHP4扩展模块开发入门(一)v2005.05.19 现场开发实例

下面要讲的东西:
1、如何获取传入的参数
    例如传入参数的个数,类型,是否引用传递

2、如何返回结果
    例如返回状态,或者给应用参数赋值


.......
简单的来说,就是所谓的黑箱:
我们的函数怎么做,使用者一般不必知道;
他所要知道的是:
我给你什么参数,你给我返回什么数据;

那我们要作的就是:
接受它的参数,返回数据给他
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP