Chinaunix首页 | 论坛 | 博客
  • 博客访问: 920872
  • 博文数量: 194
  • 博客积分: 7991
  • 博客等级: 少将
  • 技术积分: 2067
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-09 22:03
文章分类

全部博文(194)

文章存档

2010年(8)

2009年(71)

2008年(109)

2007年(6)

我的朋友

分类:

2008-01-16 16:17:00

 
(本文由 song.xian-guang 原创,如果您觉得对您有帮助,请评论之,如需转载,请指明链接;作者保留所有权利, 禁止商业用途)

根据我的提示,三分钟内你就能制作自己的PHP可扩展模块:
 
第一步:搭建模块框架
下载并解压php源代码,配置、编译、安装:
[root@localhost php-ext-demo]# tar jxvf php-5.2.5.tar.bz2
假设模块名字是sxgsystem,则运行如下命令生成模块框架:
[root@localhost ext]# pwd
/home/sxg/php-ext-demo/php-5.2.5/ext
[root@localhost ext]# ./ext_skel --extname=sxgsystem

进入目录sxgsystem,可以看到上述命令生成了不少文件,留下三个文件php_sxgsystem.h、sxgsystem.c、sxgsystem.php,其余的都删除掉
[root@localhost ext]# cd sxgsystem
[root@localhost sxgsystem]# ls
config.m4  config.w32  CREDITS  EXPERIMENTAL  php_sxgsystem.h  sxgsystem.c  sxgsystem.php  tests
[root@localhost sxgsystem]# rm -rf config.m4  config.w32  CREDITS  EXPERIMENTAL  tests

加入一个Makefile后(请适当修改, 替换sxgsystem、SXGSYSTEM成为你的模块名字),就可以编译了:
[root@localhost sxgsystem]# cat Makefile
SO_NAME   = sxgsystem
PHP_SRC   = ../php-5.2.5
TARGET    = $(SO_NAME).so
OBJS      = $(SO_NAME).o
CC        = gcc
CFLAGS    = -Wall -fpic -DCOMPILE_DL=1 -DCOMPILE_DL_SXGSYSTEM
INCLUDE   = -I$(PHP_SRC) -I$(PHP_SRC)/main -I. -I$(PHP_SRC)/TSRM -I$(PHP_SRC)/Zend
TARGET: $(OBJS)
        $(CC) -shared -L/usr/local/lib -rdynamic -o $(TARGET) $(OBJS)
%.o:%.c
        $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<
clean:
        rm -f *.o $(TARGET)

第二步:添加函数框架
在php_sxgsystem.h中添加函数声明:
PHP_FUNCTION(get_memory_info);
PHP_FUNCTION(get_cpu_info); 
 
在sxgsystem.c中填充入口,并实现之:
zend_function_entry sxgsystem_functions[] = {
 PHP_FE(get_memory_info, NULL)  /* Get Memory information */
 PHP_FE(get_cpu_info, NULL)  /* Get CPU information */
 {NULL, NULL, NULL} /* Must be the last line in sxgsystem_functions[] */
};
 
PHP_FUNCTION(get_memory_info)
{
 long ret;
 
 zend_printf("get_memory_info is called\n");
 
 RETURN_LONG(ret);
}
PHP_FUNCTION(get_cpu_info)
{
 long ret;
 
 zend_printf("get_cpu_info is called\n");
 
 RETURN_LONG(ret);
}
 
编译生成sxgsystem.so:
[root@localhost sxgsystem]# make
 
用sxgsystem.php进行测试:
//sxgsystem.php
$br = (php_sapi_name() == "cli")? "":"
";
$module = "sxgsystem";
$MY_LIB = $module . "." . PHP_SHLIB_SUFFIX;
if(!extension_loaded(module))
{
 echo "loading php extention module : $MY_LIB... ";
 dl($MY_LIB);
 echo "done$br\n";
}
$functions = get_extension_funcs($module);
echo "Functions available in the test extension:$br\n";
foreach($functions as $func) {
    echo $func."$br\n";
}
echo "$br\n";
get_memory_info();
get_cpu_info();
?>
 
测试一下:
[root@localhost sxgsystem]# php -f sxgsystem.php
loading php extention module : sxgsystem.so... done
Functions available in the test extension:
get_memory_info
get_cpu_info
get_memory_info is called
get_cpu_info is called
注:执行的时候会提示sxgsystem.so不在某个目录中,手动拷贝过去即可。
 
第三步:补充完整所添加的函数
第四步:编译打包成so发布
 
另外,用C++写PHP扩展模块时,由于涉及到C和C++的名称转换问题,需要对C定义的头文件用extern "C"包围起来。
 
sxg

 
阅读(3219) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~