在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的第二個選項會在配置的時候顯示出來
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則是一定要引入的
#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");
}
這就是源碼的內容了。