中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

PHP擴展開發入門教程
來源:易賢網 閱讀:901 次 日期:2015-03-03 10:02:44
溫馨提示:易賢網小編為您整理了“PHP擴展開發入門教程”,方便廣大網友查閱!

這篇文章主要介紹了PHP擴展開發入門教程,本文講解了使用C語言在Linux系統下開發一個PHP擴展應該具備的最基本知識,需要的朋友可以參考下

PHP擴展開發

我準備在此系列博文中總結我有關PHP擴展開發的學習和感悟,力圖簡單清晰地描述在Linux系統下開發一個PHP擴展應該具備的最基本知識。水平較低,難免有錯誤,望指出。

準備工作

首先要獲取一份PHP源碼(可以從Github上簽出,或者到官網上下載最新的穩定版),然后編譯之。為了加快編譯速度,我們推薦禁用所有額外的擴展(使用--disable-all選項),但最好打開debug(使用--enable-debug選項)和線程安全(使用--enable-maintainer-zts),但要在發布擴展的時候關閉debug,視情況選擇是否需要打開線程安全:

代碼如下:

$ ./buildconf --force

$ ./configure --disable-all --enable-debug --enable-maintainer-zts

$ make

注意,我們沒有指定--prefix選項(同時也沒有make install),因為這不是必須的。注意查看輸出信息,也許你需要安裝一些依賴包才能成功編譯PHP。

編譯后的PHP的可執行程序在源碼的sapi目錄下,對應不同的宿主環境有不同的子目錄,我們以后都主要使用cli(command line interface)環境,可以建一個別名方便引用:

代碼如下:

$ alias php-dev=/usr/local/src/php-5.6.5/sapi/cli/php

有一些命令行選項是很有用的:

代碼如下:

php-dev -h          # 打印幫助信息

php-dev -v          # 打印版本信息

php-dev --ini        # 打印配置信息

php-dev -m          # 打印加載的模塊信息

php-dev -i          # phpinfo

php-dev -r <code>      # 執行code里的代碼

擴展骨架

PHP的所有官方擴展都在源碼的ext目錄下,我們自己寫的擴展也可以放在該目錄下。注意,該目錄下有個名為ext_skel的shell腳本,它是用來生成PHP擴展骨架的,使用該腳本,可以幫我們快速創建PHP擴展:

代碼如下:

$ ./ext_skel --extname=myext

上面的命令幫我們創建了一個名為myext的擴展,源碼在myext目錄下。不帶任何參數的執行該腳本可以打印幫助信息,這樣你可以查看到該腳本提供的更多選項。

接下來讓我們完成我們的擴展。進入myext目錄,編輯config.m4配置文件,找到PHP_ARG_ENABLE宏函數,去掉前面的dnl注釋(共三行)。退回到源碼根目錄,重新執行buildconf、configure和make命令:

代碼如下:

$ ./buildconf --force

$ ./configure --help | grep myext

--enable-myext Enable myext support

$ ./configure --disable-all --enable-myext --enable-debug --enable-maintainer-zts

$ make

注意,我們用./configure --help | grep myext打印了我們擴展的加載情況,如果看不到下面的輸出,則說明我們的擴展沒有配置成功,回頭檢查下config.m4文件。

這次編譯應該非常快,因為大部分代碼都已經編譯過了。PHP還有另外一種編譯擴展的方法(使用動態連接的方式,將擴展編譯為.so的文件),不過我們推薦在開發擴展的時候使用靜態編譯,因為這樣省去了在配置文件中加載擴展的步驟。

一切順利的話,我們的第一個擴展就已經可以執行了:

代碼如下:

$ php-dev -m | grep myext

myext

$ php-dev -r 'echo confirm_myext_compiled("myext") . "n";'

Congratulations! You have successfully modified ext/myext/config.m4. Module myext is now compiled into PHP.

第一個命令顯示了我們的擴展已經被加載。第二個命令執行了ext_skel擴展骨架自動為我們創建的函數。當然,這個函數毫無意義,不過我們可以很容易的把這個函數改編成hello world。

手動創建擴展

大部分教程都是以ext_skel擴展骨架為原型講述擴展開發的,這種做法當然很方便快捷。但是我個人更喜歡純手工開發擴展的方式,因為這樣更容易理解其中的每一個細節。

手動創建擴展,先進入ext目錄,創建我們的擴展目錄myext2。有幾個文件是必須的:config.m4,myext2.c和php_myext2.h。

首先,我們來編寫配置文件config.m4:

代碼如下:

PHP_ARG_ENABLE(myext2, whether to enable myext2 support,

[ --enable-myext2 Enable myext2 support])

if test "PHP_MYEXT2" != "no"; then

PHP_NEW_EXTENSION(myext2, myext2.c, $ext_shared)

fi

config.m4其實是autoconf程序使用的配置文件,autoconf是autotools工具箱里重要的組成。完整介紹autoconf的用法是需要很長時間的,好在我們這里的用法非常簡單。

PHP_ARG_ENABLE是PHP為autoconf定義的宏函數,myext2是它的第一個參數,指出了擴展的名字;后面兩個參數只是在make和configure執行時用來顯示的,所以我們可以隨便寫。[ ]在autoconf語法中的作用類似于雙引號,用來包裹字符串(注意第二個參數中包含了空格,但是可以不用方括號起來)。還有第四個參數用來指明擴展默認是開啟還是關閉(yes或no),默認是no。

下面三行其實就是shell語法,判斷我們是否開啟了PHP_MYEXT2擴展模塊。如果開啟了該擴展模塊(--enable-myext2),則$PHP_MYEXT2變量的值不為no,因此執行PHP_NEW_EXTENSION宏。這個宏函數也是PHP為autoconf定義的擴展語法,第一個參數同樣是擴展名稱;第二個參數是擴展要編譯的C文件,如果有多個,依次寫下去就可以了(空格分隔);第三個參數固定是$ext_shared。

接下來編寫php_myext2.h頭文件,該文件的命名是PHP擴展的規范 — php_擴展名.h:

代碼如下:

#ifndef PHP_MYEXT2_H

#define PHP_MYEXT2_H

extern zend_module_entry myext2_module_entry;

#define phpext_myext2_ptr &myext2_module_entry

#define PHP_MYEXT2_VERSION "0.1.0"

/* prototypes */

PHP_FUNCTION(hello);

#endif /* PHP_MYEXT2_H */

這里主要的代碼是定義了名為phpext_myext2_ptr的宏,PHP底層通過該宏來引用我們的擴展。可以看出,該宏的命名同樣是有規范的 — phpext_擴展名_ptr。而myext2_module_entry是我們稍后要在.c文件里定義的結構體,它的命名也是規范的 — 擴展名_module_entry。

此外我們還定義了一個標識我們擴展版本號的宏和一個函數原型(通過PHP_FUNCTION宏,PHP_FUNCTION宏函數的參數是外部可使用的函數名),稍后我們會來實現這個函數。

最后來看下myext2.c文件的實現:

代碼如下:

#include "php.h"

#include "php_myext2.h"

/* {{{ myext2_functions[]

*

* Every user visible function must have an entry in myext2_functions[].

*/

static const zend_function_entry myext2_functions[] = {

PHP_FE(hello, NULL)

PHP_FE_END

};

/* }}} */

/* {{{ myext2_module_entry

*/

zend_module_entry myext2_module_entry = {

STANDARD_MODULE_HEADER,

"myext2", /* module name */

myext2_functions, /* module functions */

NULL, /* module initialize */

NULL, /* module shutdown */

NULL, /* request initialize */

NULL, /* request shutdown */

NULL, /* phpinfo */

PHP_MYEXT2_VERSION, /* module version */

STANDARD_MODULE_PROPERTIES

};

/* }}} */

#ifdef COMPILE_DL_MYEXT2

ZEND_GET_MODULE(myext2)

#endif

/* {{{ proto void hello()

Print "hello world!" */

PHP_FUNCTION(hello)

{

php_printf("hello world!n");

}

/* }}} */

對比下擴展骨架創建的.c文件就會發現,我們的.c文件非常的簡單,其實這些對一個最基本的擴展來說就已經足夠了。

上面的代碼是簡單而清晰的,大部分注釋已經很具說明性了。我們再簡要概括下:

1.開頭包含我們要用到的頭文件。php.h是必須的,它已經幫我們包含了我們會用到的絕大多數的標準庫文件,比如stdio.h,stdlib.h等等。

2.myext2_functions定義了由我們要暴露出去的函數構成的結構體數組,每一個元素通過PHP_FE宏來指定。PHP_FE宏有兩個參數,第一個是外部可使用的函數名,第二個是參數信息(這里我們簡單使用了NULL),最后一個元素必須是PHP_FE_END。注意它的注釋,再次強調,每一個要暴露給外部使用的函數,都必須在該結構體數組中有定義。

3.myext2_module_entry定義了我們的模塊信息,它是一個結構體,大部分屬性都已經通過注釋給出了說明。注意中間的五個函數指針,我們都簡單的置為了NULL,在后續的博文中會講述它們的用法。

4.ZEND_GET_MODULE(myext2)宏函數是被ifdef宏包含的,所以說它是否調用是視情況而定的。至于什么情況下會被調用,什么情況下不會被調用,在后續的博文中會講述。

5.最后幾行代碼我們實現了hello函數,它很簡單,調用php_printf輸出hello world!跟一個換行符,php_printf的用法和printf完全一樣。

6.注釋里的 {{{ 和 }}} 是為了方便vim等編輯器折疊而使用的,我們推薦你也這樣來寫注釋。

這里面涉及了一些宏,比如PHP_FE,PHP_FE_END,PHP_FUNCTION等等,完整介紹這些宏要到后續的博文中才可以,眼下最簡單的辦法就是記住這些宏。

注意到我們每一個文件的命名,變量的命名,空格和縮進,以及注釋等都是非常規范的,遵循這些規范,可以使我們編寫的代碼和PHP本身的代碼更加契合,我們也推薦你使用這樣的規范來開發PHP擴展。

最后,編譯運行我們的擴展:

代碼如下:

$ ./buildconf --force

$ ./configure --help | grep myext2

--enable-myext2 Enable myext2 support

$ ./configure --disable-all --enable-myext2 --enable-debug --enable-maintainer-zts

$ make

$ php-dev -m | grep myext2

myext2

$ php-dev -r 'hello();'

hello world!

更多信息請查看IT技術專欄

更多信息請查看網絡編程
易賢網手機網站地址:PHP擴展開發入門教程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美一区不卡| 亚洲欧洲99久久| 国产在线视频欧美一区二区三区| 国产午夜精品久久久久久免费视 | 国产网站欧美日韩免费精品在线观看 | 国产精品免费区二区三区观看| 欧美一区二区免费观在线| 一区二区三区欧美在线观看| 中文久久乱码一区二区| 亚洲最新视频在线| 国产精品福利片| 狠狠综合久久av一区二区小说| 一区二区在线观看视频| 99亚洲视频| 久热爱精品视频线路一| 国产欧美大片| 日韩视频不卡| 欧美成人免费一级人片100| 国产精品视屏| 亚洲精品在线观| 欧美在线免费观看视频| 国产精品久久久久久户外露出| 亚洲欧洲精品天堂一级| 久久午夜影视| 一区二区三区在线高清| 久久噜噜噜精品国产亚洲综合 | 亚洲欧美卡通另类91av| 免费不卡在线观看av| 极品尤物一区二区三区| 久久久久久久网站| 狠狠色丁香婷婷综合| 久久精品在线免费观看| 国产综合色产在线精品| 久久久免费精品视频| 禁久久精品乱码| 欧美黄色视屏| 一区二区成人精品| 国产亚洲精品v| 免费成人小视频| 亚洲精品免费一二三区| 欧美日韩精品久久久| 亚洲视频自拍偷拍| 国产一区二区三区四区在线观看| 久久国产视频网| 亚洲精品乱码久久久久久| 欧美日韩天堂| 午夜视频在线观看一区二区| 精品动漫3d一区二区三区免费版 | 久久久久久久久久久成人| 国产婷婷一区二区| 欧美激情中文字幕一区二区| 亚洲自拍三区| 亚洲国产精品123| 国产精品久久久久av| 免费在线看一区| 午夜精品网站| 一区二区高清视频在线观看| 国产自产v一区二区三区c| 欧美午夜欧美| 欧美老女人xx| 免费一级欧美片在线播放| 欧美在线不卡| 香蕉国产精品偷在线观看不卡| 亚洲理论在线观看| 亚洲第一搞黄网站| 在线精品观看| 亚洲国产91| 亚洲国产精品久久人人爱蜜臀| 国产亚洲欧洲一区高清在线观看 | 性色一区二区三区| 欧美一区二区三区免费在线看| 宅男精品导航| 亚洲欧美另类在线| 欧美影院在线播放| 久久国产精品久久精品国产| 久久精品国产一区二区三区| 久久精品视频在线观看| 久久综合色88| 欧美精品一区二区三区很污很色的| 免费亚洲网站| 国产精品久久久久毛片软件| 国产精品一卡二| 红桃视频一区| 99在线精品视频在线观看| 中日韩美女免费视频网站在线观看| 亚洲欧美日韩国产中文在线| 久久精品夜夜夜夜久久| 欧美国产日韩一区二区| 国产精品久久久久久亚洲调教| 国产日韩精品一区观看| 最近看过的日韩成人| 亚洲免费影视| 欧美成人精品福利| 国产一区二区三区久久久| 亚洲免费观看高清在线观看 | 久久一二三国产| 欧美黄色影院| 国产一区二区电影在线观看| 99av国产精品欲麻豆| 久久久99精品免费观看不卡| 国产精品扒开腿爽爽爽视频| 狠狠色伊人亚洲综合网站色| 99精品热视频| 欧美巨乳波霸| 亚洲国产一区二区精品专区| 在线一区二区三区做爰视频网站 | 美日韩丰满少妇在线观看| 国产精品三级视频| 中文在线资源观看网站视频免费不卡 | 国产精品久久婷婷六月丁香| 韩日欧美一区| 久久精品国产一区二区三区 | 国产精品日韩久久久| 伊人精品久久久久7777| 午夜久久黄色| 国产精品一区久久| 在线午夜精品| 欧美日韩一区二区视频在线观看 | 久久久国产午夜精品| 欧美一区二区三区在线| 亚洲综合999| 亚洲欧洲另类国产综合| 欧美日韩在线看| 亚洲电影免费观看高清| 好看的日韩av电影| 精品动漫3d一区二区三区免费版| 一区二区三区在线视频播放| 欧美成人精品三级在线观看 | 欧美a级一区二区| 亚洲品质自拍| 国产精品人人做人人爽| 欧美一区二区三区免费视| 国产欧美在线| 久久亚洲视频| 99精品免费| 国产精品久久久久永久免费观看| 国精品一区二区| 欧美va亚洲va国产综合| 亚洲精品偷拍| 国产一区二区精品丝袜| 看欧美日韩国产| 一区二区三区国产精华| 国产亚洲精品aa| 欧美视频日韩| 麻豆久久久9性大片| 午夜精品福利视频| 日韩一区二区精品视频| 国产一区二区三区免费观看| 欧美日韩国产三区| 久久久国产成人精品| 亚洲综合久久久久| 一本一本久久a久久精品综合妖精| 好看的日韩视频| 国产精品推荐精品| 欧美午夜精品久久久久久人妖| 久久久精彩视频| 久久精品二区| 久久福利资源站| 欧美一区2区三区4区公司二百 | 在线欧美日韩精品| 国产精品一区二区久激情瑜伽 | 欧美日韩另类丝袜其他| 免费观看日韩| 欧美精品激情blacked18| 欧美大片一区| 欧美国产精品v| 欧美激情第10页| 欧美日精品一区视频| 欧美日韩专区| 国产精品久久中文| 黑丝一区二区三区| 亚洲乱码精品一二三四区日韩在线| 日韩视频在线你懂得| 亚洲一区二区在线播放| 久久狠狠亚洲综合| 牛牛精品成人免费视频| 欧美午夜剧场| 国内成人精品一区| 亚洲伦理在线| 午夜精品久久| 欧美精品一区二区三区在线看午夜 | 一区二区三区免费看| 欧美在线视频免费| 欧美激情一级片一区二区| 国产精品在线看| 亚洲日本成人| 久久这里只精品最新地址| 欧美日韩综合另类| 最新高清无码专区| 久久全国免费视频| 国产日韩欧美日韩| 一本色道久久综合亚洲91| 久久欧美中文字幕| 国产精品私人影院| 亚洲乱码国产乱码精品精| 免费久久99精品国产自在现线| 国产精品一二三四| 亚洲欧美日韩精品久久亚洲区| 欧美福利视频一区| 亚洲精品视频在线看|