PHP7擴(kuò)展開發(fā)教程之Hello World實(shí)現(xiàn)方法示例
本文實(shí)例講述了PHP7擴(kuò)展開發(fā)教程之Hello World實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
一、下載PHP源代碼
要開發(fā)PHP擴(kuò)展,需要先下載PHP的源代碼,一方面是因?yàn)槲覀兊臄U(kuò)展一般會用到PHP自身定義的函數(shù)和宏,另一方面我們可以利用官方提供的工具減少工作量。
我下載了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7.0.2.tar.gz。
解壓源碼壓縮包, tar xzf php-7.0.2.tar.gz,我們現(xiàn)在只需要關(guān)注Zend和ext這兩個目錄。
Zend目錄里面包含了PHP的Zend Engine源代碼,有些函數(shù)和宏的定義我們需要在這里面簡單地看一下。
ext目錄里面包含了PHP原生的擴(kuò)展,以及我們開發(fā)自己的擴(kuò)展時可以利用的工具,Linux下使用ext_skel,Windows下使用ext_skel_win32.php
二、使用ext_skel工具
我們可以在ext目錄下看到所有的PHP原生擴(kuò)展,其中包括了熟悉的curl,json,mbstring,simplexml,sockets等擴(kuò)展,還有很多沒有用過甚至沒有聽說過的擴(kuò)展,不用在意這些,我們先打開我們最熟悉的curl來看看,有config.m4配置文件,有php_curl.h,curl_file.c等源代碼,還有一些中間文件,最后還有一個tests目錄,里面放的curl擴(kuò)展的單元測試。重點(diǎn)關(guān)注config.m4,php_curl.h,curl_file.c即可,最簡單的場景下這三個文件就是一個擴(kuò)展的全部組成部分了。
打開隨便看一下,不算太復(fù)雜,但是自己寫一個類似的還是挺頭疼的,這時就需要用到我前面提到的ext_skel工具了。這個工具也在ext目錄下,我們執(zhí)行一下,./ext_skel --help,可以看到若干參數(shù),我們用到的只有--extname=module,這里填上自己開發(fā)的擴(kuò)展名稱。想深入了解各個參數(shù)的作用可以看這里:http://php.net/manual/en/internals2.buildsys.skeleton.php
./ext_skel --extname=hello
ext目錄下多了一個hello目錄,我們后續(xù)的工作都在這個目錄下面,工具已經(jīng)為我們自動生成了一些文件。
config.m4配置文件
開發(fā)PHP擴(kuò)展,在寫C代碼之前,要先配置一下這里。我們打開可以看到詳細(xì)的注釋說明,dnl是注釋語法。
如果你的擴(kuò)展用到了外部依賴,就配置--with-hello選項(xiàng),否則配置--enable-hello選項(xiàng),刪除這下面3行的del注釋
PHP_ARG_ENABLE(hello, whether to enable hello support, Make sure that the comment is aligned: [ --enable-hello Enable hello support])
PHP_ARG_WITH和PHP_ARG_ENABLE這兩個宏用來配置configure選項(xiàng),一個配置需要外部依賴的,另一個配置不需要外部依賴的
配置好的內(nèi)容,在后面執(zhí)行configure --help時可以看到。
php_hello.h頭文件
類似于C語音的頭文件,包含了一些自定義的結(jié)構(gòu)和函數(shù)聲明,在這個demo中暫時不需要改動
hello.c代碼文件
真正的邏輯代碼都在這個文件中,后面會詳細(xì)介紹。
三、編寫代碼
好了,到這一步我們終于要開始寫代碼了,打開hello.c文件。
整個擴(kuò)展的入口是zend_module_entry這個結(jié)構(gòu),具體的定義可以在Zend目錄下的zend_modules.h文件中看到,一共有十幾個屬性,快速跳過,我們暫時只需要"hello world"。
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
};
STANDARD_MODULE_HEADER幫我們實(shí)現(xiàn)了前面6個屬性
"hello"是擴(kuò)展的名字
hello_functions是擴(kuò)展包含的全部方法的集合
后面5個宏分別代表5個擴(kuò)展特定方法
PHP_HELLO_VERSION是擴(kuò)展的版本號,定義在頭文件中
STANDARD_MODULE_PROPERTIES幫我們實(shí)現(xiàn)了剩下的屬性
暫時都不需要修改,知道這是一個入口就行。順著這個入口,我們繼續(xù)看怎么給擴(kuò)展添加方法,在hello_functions[]方法數(shù)組中已經(jīng)有了一個示例方法confirm_hello_compiled,我們參考它寫我們的方法hello_world
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[] */
};
先在擴(kuò)展的方法數(shù)組中添加上hello_world,然后再定義hello_world。找到confirm_hello_compiled方法定義的地方,在它下面依葫蘆畫瓢,php_printf是Zend Engine中的printf方法。
PHP_FUNCTION(hello_world)
{
php_printf("Hello World!\n");
RETURN_TRUE;
}
四、編譯安裝
最后就是編譯安裝我們的擴(kuò)展了,安裝過PHP擴(kuò)展的同學(xué)不用看,沒有經(jīng)驗(yàn)的可以參考一下。
phpize
./configure make make install
現(xiàn)在PHP的擴(kuò)展目錄中已經(jīng)有了hello.so這個文件,在php.ini中添加上擴(kuò)展的配置
extension = hello.so
五、測試
寫一個test.php方法,執(zhí)行腳本就可以看到"Hello World!"
<?php hello_world();
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP擴(kuò)展開發(fā)教程》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
- PHP擴(kuò)展開發(fā)教程(總結(jié))
- PHP擴(kuò)展開發(fā)入門教程
- PHP內(nèi)核介紹及擴(kuò)展開發(fā)指南—基礎(chǔ)知識
- 初步介紹PHP擴(kuò)展開發(fā)經(jīng)驗(yàn)分享
- PHP7擴(kuò)展開發(fā)之基于函數(shù)方式使用lib庫的方法詳解
- PHP7擴(kuò)展開發(fā)之hello word實(shí)現(xiàn)方法詳解
- 快速開發(fā)一個PHP擴(kuò)展圖文教程
- 詳解Window7 下開發(fā)php擴(kuò)展
- 一個簡單php擴(kuò)展介紹與開發(fā)教程
- 關(guān)于嘗試開發(fā)PHP的MYSQL擴(kuò)展的使用
- windows下開發(fā)并編譯PHP擴(kuò)展的方法
- php擴(kuò)展開發(fā)入門demo示例
相關(guān)文章
詳解如何使用PHP實(shí)現(xiàn)動態(tài)代理IP的功能
動態(tài)代理IP是一種通過不斷切換不同的代理IP來隱藏真實(shí)IP地址的技術(shù),動態(tài)代理IP可以有效地解決IP被封鎖或訪問限制的問題,本文將使用PHP語言實(shí)現(xiàn)動態(tài)代理IP的功能,需要的朋友可以參考下2024-03-03
自己寫的兼容低于PHP 5.5版本的array_column()函數(shù)
這篇文章主要介紹了自己寫的兼容低于PHP 5.5版本的array_column()函數(shù),array_column是PHP 5.5新增函數(shù),有時在低版本中也可能要用到,需要的朋友可以參考下2014-10-10
在任意字符集下正常顯示網(wǎng)頁的方法二(續(xù))
在任意字符集下正常顯示網(wǎng)頁的方法二(續(xù))...2007-04-04

