《PHP編程:PHP7擴展開發教程之Hello World實現方法示例》要點:
本文介紹了PHP編程:PHP7擴展開發教程之Hello World實現方法示例,希望對您有用。如果有疑問,可以聯系我們。
PHP學習本文實例講述了PHP7擴展開發教程之Hello World實現方法.分享給大家供大家參考,具體如下:
PHP學習一、下載PHP源代碼
PHP學習要開發PHP擴展,需要先下載PHP的源代碼,一方面是因為我們的擴展一般會用到PHP自身定義的函數和宏,另一方面我們可以利用官方提供的工具減少工作量.
PHP學習我下載了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7.0.2.tar.gz.
PHP學習解壓源碼壓縮包, tar xzf php-7.0.2.tar.gz,我們現在只需要關注Zend和ext這兩個目錄.
PHP學習Zend目錄里面包含了PHP的Zend Engine源代碼,有些函數和宏的定義我們需要在這里面簡單地看一下.
PHP學習ext目錄里面包含了PHP原生的擴展,以及我們開發自己的擴展時可以利用的工具,Linux下使用ext_skel,Windows下使用ext_skel_win32.php
PHP學習二、使用ext_skel工具
PHP學習我們可以在ext目錄下看到所有的PHP原生擴展,其中包括了熟悉的curl,json,mbstring,simplexml,sockets等擴展,還有很多沒有用過甚至沒有聽說過的擴展,不用在意這些,我們先打開我們最熟悉的curl來看看,有config.m4配置文件,有php_curl.h,curl_file.c等源代碼,還有一些中間文件,最后還有一個tests目錄,里面放的curl擴展的單元測試.重點關注config.m4,php_curl.h,curl_file.c即可,最簡單的場景下這三個文件就是一個擴展的全部組成部分了.
PHP學習打開隨便看一下,不算太復雜,但是自己寫一個類似的還是挺頭疼的,這時就需要用到我前面提到的ext_skel工具了.這個工具也在ext目錄下,我們執行一下,./ext_skel --help,可以看到若干參數,我們用到的只有--extname=module,這里填上自己開發的擴展名稱.想深入了解各個參數的作用可以看這里:http://php.net/manual/en/internals2.buildsys.skeleton.php
PHP學習
./ext_skel --extname=hello
PHP學習ext目錄下多了一個hello目錄,我們后續的工作都在這個目錄下面,工具已經為我們自動生成了一些文件.
PHP學習config.m4配置文件
PHP學習開發PHP擴展,在寫C代碼之前,要先配置一下這里.我們打開可以看到詳細的注釋說明,dnl是注釋語法.
PHP學習如果你的擴展用到了外部依賴,就配置--with-hello選項,否則配置--enable-hello選項,刪除這下面3行的del注釋
PHP學習
PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[ --enable-hello Enable hello support])
PHP學習PHP_ARG_WITH和PHP_ARG_ENABLE這兩個宏用來配置configure選項,一個配置需要外部依賴的,另一個配置不需要外部依賴的
PHP學習配置好的內容,在后面執行configure --help
時可以看到.
PHP學習php_hello.h頭文件
PHP學習類似于C語音的頭文件,包含了一些自定義的結構和函數聲明,在這個demo中暫時不需要改動
PHP學習hello.c代碼文件
PHP學習真正的邏輯代碼都在這個文件中,后面會詳細介紹.
PHP學習三、編寫代碼
PHP學習好了,到這一步我們終于要開始寫代碼了,打開hello.c文件.
PHP學習整個擴展的入口是zend_module_entry這個結構,具體的定義可以在Zend目錄下的zend_modules.h文件中看到,一共有十幾個屬性,快速跳過,我們暫時只需要"hello world".
PHP學習
zend_module_entry hello_module_entry = {
STANDARD_MODULE_HEADER,
"hello",
hello_functions,
PHP_MINIT(hello),
PHP_MSHUTDOWN(hello),
PHP_RINIT(hello), /* Replace with NULL if there's nothing to do at request start */
PHP_RSHUTDOWN(hello), /* Replace with NULL if there's nothing to do at request end */
PHP_MINFO(hello),
PHP_HELLO_VERSION,
STANDARD_MODULE_PROPERTIES
};
PHP學習STANDARD_MODULE_HEADER幫我們實現了前面6個屬性
PHP學習"hello"是擴展的名字
PHP學習hello_functions是擴展包含的全部方法的集合
PHP學習后面5個宏分別代表5個擴展特定方法
PHP學習PHP_HELLO_VERSION是擴展的版本號,定義在頭文件中
PHP學習STANDARD_MODULE_PROPERTIES幫我們實現了剩下的屬性
PHP學習暫時都不需要修改,知道這是一個入口就行.順著這個入口,我們繼續看怎么給擴展添加方法,在hello_functions[]方法數組中已經有了一個示例方法confirm_hello_compiled,我們參考它寫我們的方法hello_world
PHP學習
const zend_function_entry hello_functions[] = {
PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */
PHP_FE(hello_world, NULL)
PHP_FE_END /* Must be the last line in hello_functions[] */
};
PHP學習先在擴展的方法數組中添加上hello_world,然后再定義hello_world.找到confirm_hello_compiled方法定義的地方,在它下面依葫蘆畫瓢,php_printf是Zend Engine中的printf方法.
PHP學習
PHP_FUNCTION(hello_world)
{
php_printf("Hello World!\n");
RETURN_TRUE;
}
PHP學習四、編譯安裝
PHP學習最后就是編譯安裝我們的擴展了,安裝過PHP擴展的同學不用看,沒有經驗的可以參考一下.
PHP學習phpize
PHP學習
./configure
make
make install
PHP學習現在PHP的擴展目錄中已經有了hello.so這個文件,在php.ini中添加上擴展的配置
PHP學習
extension = hello.so
PHP學習五、測試
PHP學習寫一個test.php方法,執行腳本就可以看到"Hello World!"
PHP學習
<?php
hello_world();
PHP學習更多關于PHP相關內容感興趣的讀者可查看本站專題:《PHP擴展開發教程》、《php面向對象程序設計入門教程》、《php+mysql數據庫操作入門教程》、《PHP網絡編程技巧總結》及《php常見數據庫操作技巧匯總》
PHP學習希望本文所述對大家PHP程序設計有所幫助.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/377.html