php的扩展和嵌入–c扩展开发helloworld

在linux下面完成了lamp的配置环境之后,就可以进行php的扩展开发了。

php中的扩展开发都在源码包的/ext文件夹之下,可以看到这里已经有了很多开发好的扩展。比如与数据库相关的mysql以及xml处理的模块等等。

首先建立一个文件夹:

mkdir hello

在进入这个文件夹之后,先创建并打开一个配置文件:

vim config.m4

这个给出一个配置问题的实例:

1 php_arg_enable(sample, whether to enable sample support,
2 [ –enable-sample enable sample support])
3 if test “$php_sample” = “yes”; then
4 ac_define(sample, 1, [whether you have sample])
5 php_new_extension(sample, sample.c, $ext_shared)
6 fi
* 这个配置文件创造了一个–enable-hello的配置选项,而php_arg_enable的第二个选项会在配置的时候显示出来
* php_arg_enable的第三个参数则是在调用./configurehelp的时候会显示出来
* 为什么有时候用enable-xxx,有时候用with-xxx?enable是可以关掉的,但是with需要额外的第三方的库
* 如果说–enable-hello在配置的时候有了,那么$php_hello这个参数就会被设为yes,那么才有接下来的操作
* php_new_extension则是要声明所有需要的源文件:php_new_extension(sample, sample.c sample2.c sample3.c, $ext_shared)
* 最后一个参数在building一个shared module的时候一般是这么些的。$ext_shared

下面列出在config文件中可能有的配置选项:
* php_arg_with 或者 php_arg_enable 指定了php扩展模块的工作方式,前者意味着不需要第三方库,后者正好相反;
* php_require_cxx 用于指定这个扩展用到了c++;
* php_add_include 指定php扩展模块用到的头文件目录;
* php_check_library 指定php扩展模块php_add_library_with_path定义以及库连接错误信息等;
* php_add_library(stdc++,””,extern_name_libadd)用于将标准c++库链接进入扩展
* php_subst(extern_name_shared_libadd) 用于说明这个扩展编译成动态链接库的形式;
* php_new_extension 用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开;

接下来看头文件:php_sample.h
1 ?#ifndef php_sample_h
2 /* 防止两次引入 */
3 #define php_sample_h
4 /* 定义扩展的性质 */
5 #define php_sample_extname “sample”
6 #define php_sample_extver “1.0”
7 /* 当在php的源码树之外build的时候,引入配置选项, 在使用phpize工具时,一般都是先定义的 */
8 #ifdef have_config_h
9 #include “config.h”
10 #endif
11 /* 引入php标准头文件 */
12 #include “php.h”
13 php_function(hello_world);//声明扩展中的函数
14 /* 定义入口点的符号,zend在加载这个module的时候会用*/
15 extern zend_module_entry sample_module_entry;
16 #define phpext_sample_ptr &sample_module_entry
17 #endif /* php_sample_h */
最后再注意两点:
* php.h则是一定要引入的
* 声明zend_module_entry被声明为extern,所以当扩展被以extension=。。的形式加载的时候,zend能够通过dlopen()和dlsym()找到它。

最后来看源文件sample.c:
#include “php_sample.h”
static function_entry php_sample_functions[] = {
php_fe(sample_hello_world, null)//任何扩展中的函数都要在这里声明。把函数名输出到了用户空间中
{ null, null, null }
};
zend_module_entry sample_module_entry = { //创建一个入口
#if zend_module_api_no >= 20010901 //这个是一个版本号
standard_module_header,
#endif
php_sample_extname,
php_sample_functions, /* functions 这里是把php_function加入到zend中去*/
null, /* minit */
null, /* mshutdown */
null, /* rinit */
null, /* rshutdown */
null, /* minfo */
#if zend_module_api_no >= 20010901
php_sample_extver,
#endif
standard_module_properties
};
#ifdef compile_dl_sample
zend_get_module(sample)
#endif //这块区域是当扩展被动态加载的时候,为zend添加一个引用,记得要添加上就行。
/*真正的函数体的部分*/
php_function(sample_hello_world)
{
php_printf(“hello world!\n”);
}
这就是源码的内容了。

接下来需要进行扩展的生成:
phpize
./configure –enable-sample
make
sudo make install
在执行完这些语句之后,需要在php.ini中添加这个扩展名:extension=sample.so
然后再重启一下apache
sudo /etc/init.d/httpd restart

接下来在phpinfo页面中查看是否sample这个扩展已经有了,如果有了,那么在下面test.php中验证:

如果打印除了”hello world!”,那么就说明这个php扩展开发成功了。

http://www.bkjia.com/phpjc/621615.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/621615.htmltecharticle在linux下面完成了lamp的配置环境之后,就可以进行php的扩展开发了。 php中的扩展开发都在源码包的/ext文件夹之下,可以看到这里已经有了…

Posted in 未分类