php的擴充和嵌入--c擴充開發helloworld_PHP教程

來源:互聯網
上載者:User
在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"; then4    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_H2  /* 防止兩次引入 */3  #define PHP_SAMPLE_H4  /* 定義擴充的性質 */5  #define PHP_SAMPLE_EXTNAME "sample"6  #define PHP_SAMPLE_EXTVER "1.0"7  /* 當在php的源碼樹之外build的時候,引入配置選項, 在使用phpize工具時,一般都是先定義的 */8  #ifdef HAVE_CONFIG_H9  #include "config.h"10  #endif11  /* 引入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_entry17  #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_SAMPLEZEND_GET_MODULE(sample)#endif //這塊地區是當擴充被動態載入的時候,為Zend添加一個引用,記得要添加上就行。/*真正的函數體的部分*/PHP_FUNCTION(sample_hello_world){    php_printf("Hello World!\n");}
這就是源碼的內容了。
接下來需要進行擴充的產生:phpize./configure --enable-samplemakesudo make install在執行完這些語句之後,需要在php.ini中添加這個副檔名:extension=sample.so然後再重啟一下apachesudo /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檔案夾之下,可以看到這裡已經有了...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.