|
php取得成功的一個主要原因之一是她擁有大量的可用擴展。web開發(fā)者無論有何種需求,這種需求最有可能在php發(fā)行包里找到。php發(fā)行包包括支持各種數(shù)據(jù)庫,圖形文件格式,壓縮,XML技術(shù)擴展在內(nèi)的許多擴展。
擴展API的引入使php3取得了巨大的進展,擴展API機制使php開發(fā)社區(qū)很容易的開發(fā)出幾十種擴展。現(xiàn)在,兩個版本過去了,API仍然和php3時的非常相似。擴展主要的思想是:盡可能的從擴展編寫者那里隱藏php的內(nèi)部機制和腳本引擎本身,僅僅需要開發(fā)者熟悉API。
有兩個理由需要自己編寫php擴展。第一個理由是:php需要支持一項她還未支持的技術(shù)。這通常包括包裹一些現(xiàn)成的C函數(shù)庫,以便提供php接口。例如,如果一個叫FooBase的數(shù)據(jù)庫已推出市場,你需要建立一個php擴展幫助你從php里調(diào)用FooBase的C函數(shù)庫。這個工作可能僅由一個人完成,然后被整個php社區(qū)共享(如果你愿意的話)。第二個不是很普遍的理由是:你需要從性能或功能的原因考慮來編寫一些商業(yè)邏輯。
如果以上的兩個理由都和你沒什么關(guān)系,同時你感覺自己沒有冒險精神,那么你可以跳過本章。
本章教你如何編寫相對簡單的php擴展,使用一部分?jǐn)U展API函數(shù)。對于大多數(shù)打算開發(fā)自定義php擴展開發(fā)者而言,它含概了足夠的資料。學(xué)習(xí)一門編程課程的最好方法之一就是動手做一些極其簡單的例子,這些例子正是本章的線索。一旦你明白了基礎(chǔ)的東西,你就可以在互聯(lián)網(wǎng)上通過閱讀文擋、原代碼或參加郵件列表新聞組討論來豐富自己。因此,本章集中在讓你如何開始的話題。在UNIX下一個叫ext_skel的腳本被用于建立擴展的骨架,骨架信息從一個描述擴展接口的定義文件中取得。因此你需要利用UNIX來建立一個骨架。Windows開發(fā)者可以使用Windows ext_skel_win32.php代替ext_skel。
然而,本章關(guān)于用你開發(fā)的擴展編譯php的指導(dǎo)僅涉及UNIX編譯系統(tǒng)。本章中所有的對API的解釋與UNIX和Windows下開發(fā)的擴展都有聯(lián)系。
當(dāng)你閱讀完這章,你能學(xué)會如何
•建立一個簡單的商業(yè)邏輯擴展。
•建議個C函數(shù)庫的包裹擴展,尤其是有些標(biāo)準(zhǔn)C文件操作函數(shù)比如fopen()
快速開始
本節(jié)沒有介紹關(guān)于腳本引擎基本構(gòu)造的一些知識,而是直接進入擴展的編碼講解中,因此不要擔(dān)心你無法立刻獲得對擴展整體把握的感覺。假設(shè)你正在開發(fā)一個網(wǎng)站,需要一個把字符串重復(fù)n次的函數(shù)。下面是用php寫的例子:
復(fù)制代碼 代碼如下:
function self_concat($string, $n){
$result = "";
for($i = 0; $i < $n; $i++){
$result .= $string;
}
return $result;
}
self_concat("One", 3) returns "OneOneOne".
self_concat("One", 1) returns "One".
假設(shè)由于一些奇怪的原因,你需要時常調(diào)用這個函數(shù),而且還要傳給函數(shù)很長的字符串和大值n。這意味著在腳本里有相當(dāng)巨大的字符串連接量和內(nèi)存重新分配過程,以至顯著地降低腳本執(zhí)行速度。如果有一個函數(shù)能夠更快地分配大量且足夠的內(nèi)存來存放結(jié)果字符串,然后把$string重復(fù)n次,就不需要在每次循環(huán)迭代中分配內(nèi)存。
為擴展建立函數(shù)的第一步是寫一個函數(shù)定義文件,該函數(shù)定義文件定義了擴展對外提供的函數(shù)原形。該例中,定義函數(shù)只有一行函數(shù)原形self_concat() :
復(fù)制代碼 代碼如下:
string self_concat(string str, int n)
函數(shù)定義文件的一般格式是一個函數(shù)一行。你可以定義可選參數(shù)和使用大量的php類型,包括: bool, float, int, array等。
保存為myfunctions.def文件至php原代碼目錄樹下。
該是通過擴展骨架(skeleton)構(gòu)造器運行函數(shù)定義文件的時機了。該構(gòu)造器腳本叫ext_skel,放在php原代碼目錄樹的ext/目錄下(php原碼主目錄下的README.EXT_SKEL提供了更多的信息)。假設(shè)你把函數(shù)定義保存在一個叫做myfunctions.def的文件里,而且你希望把擴展取名為myfunctions,運行下面的命令來建立擴展骨架
復(fù)制代碼 代碼如下:
./ext_skel --extname=myfunctions --proto=myfunctions.de
這個命令在ext/目錄下建立了一個myfunctions/目錄。你要做的第一件事情也許就是編譯該骨架,以便編寫和測試實際的C代碼。編譯擴展有兩種方法:
•作為一個可裝載模塊或者DSO(動態(tài)共享對象)
•靜態(tài)編譯到php

php擴展開發(fā)導(dǎo)圖
因為第二種方法比較容易上手,所以本章采用靜態(tài)編譯。如果你對編譯可裝載擴展模塊感興趣,可以閱讀php原代碼根目錄下的README.SELF-CONTAINED_EXTENSIONS文件。為了使擴展能夠被編譯,需要修改擴展目錄ext/myfunctions/下的config.m4文件。擴展沒有包裹任何外部的C庫,你需要添加支持 主站蜘蛛池模板: 《魔》| 《高校教师》日本电影| 91天堂素人97年清纯嫩模| 死亡半径| 文王一支笔的功效与作用| 丁丁历险记电影| 王菲电影| 林青霞离婚| 凤凰卫视资讯台直播| 六级词汇电子版| 性的视频| 少儿不宜视频| 孤战迷城 电视剧| 西海情歌原歌词全文| 浣肠アナル地狱| 白玉老虎| 斯维特拜克之歌| 丁丁历险记电影| 碳水是指哪些食物| 眼泪工匠| 国有企业党建讲话原文| 折叠画| 无常电影| 村暖花开| 美女mm免费视频| 刘浩存个人简历图片| 孤战迷城电视剧剧情分集介绍| 员工离职协议书| 新生儿喂奶粉的量和时间| 韩国电影《甜性涩爱》| 祈今朝 电视剧| 视频999| 人民日报评墨茶| 掐脖子自制短视频| 何玲| 六年级上册英语书翻译| 朱莉娅·奥蒙德| 你的名字豆瓣| 基础设施建设产业市场| 张寿懿| 假面骑士响鬼|