很長時間沒有認(rèn)真的寫篇文章纽竣,從今天開始正式學(xué)習(xí)PHP擴展開發(fā),之前在Linux上也折騰過,只是認(rèn)為在Linux上沒有熟悉的C++ IDE右犹,看PHP底層源碼不方便,是轉(zhuǎn)向Windows上部署環(huán)境姚垃,配合VS2010念链,源碼查看、智能提示方便多了。PHP擴展開發(fā)是基于C語言掂墓,自己對C/C++比較熟悉谦纱,從擴展開發(fā)這個方向了解PHP Zend虛擬機底層實現(xiàn)應(yīng)該是一條比較好的途徑。本文主要介紹在Linux君编、Windows環(huán)境如何部署PHP擴展開發(fā)環(huán)境跨嘉,以及我遇到的一些問題。
1吃嘿、Linux平臺環(huán)境配置
Linux平臺配置過程很容易祠乃,本節(jié)以centos 4.3為例
- step1:下載PHP源碼包,并解壓
- step2:使用ext_skel生成工程框架
./ext_skel --extname=myext
(1)在.h文件中聲明導(dǎo)出函數(shù):
PHP_FUNCTION(sqlapm);
(2)在.c文件中實現(xiàn)導(dǎo)出函數(shù)
PHP_FUNCTION(sqlapm)
{
php_printf("sqlapm....");
}
- step3:編譯生成.so文件
修改config.m4文件將10兑燥、11亮瓷、12三行最前面的dnl刪除掉
phpize
./configure --with-php-config=..../php/bin/php-config
make
make test
然后在工程下面module目錄下生myext.so文件,拷貝至lib/php/extensions/no-debug-non-zts-20121212目錄下降瞳,修改php.ini文件嘱支,php -m
驗證模塊是否加載。
2挣饥、Windows平臺環(huán)境配置
Linux平臺配置方式非常容易除师,但在Linux下查看php源碼,開發(fā)效率效率較低扔枫,Windows下面VS IDE非常強大汛聚,智能提示都很方便。許多教程介紹VC++6.0的配置過程短荐,但是VC++6.0平臺不支持64位編譯倚舀,而且win7以上兼容性不好,本節(jié)介紹的是VS2010配置過程搓侄。
- step1:使用ext_skel生成工程框架
php ext_skel_win32.php --extname=myext
如果生成出錯,請檢查下面兩點:
(1)事先要安裝cygwin话速,并且修改ext_skel_win32.php中的$cygwin_path路徑讶踪;
(2)源碼目錄名不能包含空格;
- step2:打開myext.dsp工程文件泊交、編譯工程
(1)這時提示main/config.win32.h文件缺少乳讥,新建config.win32.h文件,添加下面兩行:
#define SIZEOF_LONG 4
#define PHP_COMPILER_ID "VC11"
第二行的VC11版本不是根據(jù)VS2010的VC10版本廓俭,而是要與windows二進(jìn)制包中的php5ts.lib編譯使用的VC版本一致云石,下面會講php5ts.lib。
(2)再次編譯研乒,提示缺少php5ts_debug.lib
php5ts.lib來自同版本php二進(jìn)制包dev/目錄下php5ts.lib文件汹忠,php5ts_debug.lib對應(yīng)php debug包dev下的php5ts_debug.lib文件。
(3)再次編譯,可能會提示“無法解析的外部符號”
這種錯誤在C++中很常見宽菜,一般都是.lib庫沒有正確包含了谣膳,你會發(fā)現(xiàn)前面已經(jīng)包含了php5ts.lib文件,這里出錯的原因就是php5ts.lib是64位lib包铅乡,將VS2010編譯方式改成x64即可順利編譯继谚。因此不建議使用VC++6.0,直到VS2005微軟才支持x64編譯方式阵幸。
- step3:編譯dll生成在TS_Release或TS_Debug目錄下
Windows下配置環(huán)境事項:
- 建議安裝Visual Assist X插件花履,智能智能提示非常強大;
- 注意php binary包的VC編譯器版本及編譯位數(shù)(32/64)挚赊;
- VS的編譯方式也要與php binary包編譯方式保持一致(Release/Debug)诡壁;
- 列表項目config.win32.h需要改成binary VC編譯器版本;
后記:
我自己經(jīng)歷的學(xué)習(xí)PHP的過程是PHP基礎(chǔ)學(xué)習(xí)咬腕、然后結(jié)合PHP框架(如Yii欢峰、CI等)做項目。 自己也用PHP做過幾個項目涨共,PHP語法層面已經(jīng)比較熟悉纽帖,Ci框架用的比較多【俜矗框架更多的體現(xiàn)的是設(shè)計模式懊直,統(tǒng)一開發(fā)規(guī)范、避免重復(fù)造輪子火鼻,沒有項目的結(jié)合室囊,單純的看框架教程沒什么意義。眾所周知魁索,PHP開發(fā)效率高融撞,項目龐大了之后性能倒成了瓶頸,各種優(yōu)化方法也很多粗蔚。使用PHP擴展是解決性能瓶頸非常有效的方法尝偎,除此之外在擴展中引入多線程、epoll模型鹏控、Opencv都非常方便致扯。雖然擴展開發(fā)非常有用,PHP開發(fā)入門比較容易当辐,估計大部分PHP程序員都沒有使用過抖僵,還是停留在框架使用層面,擴展開發(fā)更接近Zend虛擬機底層實現(xiàn)缘揪,使用C語言開發(fā)耍群,對C/C++沒有一定的工程調(diào)試經(jīng)驗义桂,對操作系統(tǒng)及數(shù)據(jù)結(jié)構(gòu)沒有一定的理解學(xué)習(xí)起來確實很困難。后續(xù)文章會陸續(xù)介紹PHP生命周期世吨、內(nèi)核變量澡刹、HashTable實現(xiàn)、內(nèi)存管理耘婚、ZendAPI及實際擴展開發(fā)DEMO罢浇。