总结一下php5.2.16与apache2.0的C++扩展开发整个过程
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
開(kāi)發(fā)環(huán)境:ubuntu 11(虛擬機(jī)環(huán)境) 開(kāi)發(fā)平臺(tái): php-5.2.16.tar+apache2.0
PHP API 20041225 PHP Extension 20060613 Zend Extension 220060519說(shuō)明一下為什么要用這么舊的版本,沒(méi)原因,因?yàn)楣竟俜椒?wù)器是用這個(gè)版本...
之前用php5.3.10穩(wěn)定版本已經(jīng)做過(guò)一次,可是移植到php5.2.16上卻用不了。發(fā)現(xiàn)原因應(yīng)該是PHP與ZEND API不同!所以開(kāi)發(fā)擴(kuò)展時(shí)版本一定要一致啊! 一致的意思是:都是PHP5.2.X 或 PHP5.3.X 等等...
一:安裝開(kāi)發(fā)環(huán)境 如果用ubuntu自身的apt-get install 來(lái)安裝apache與php的話不一定是你需要開(kāi)發(fā)的版本!
所以還是要自己下載源代碼編譯安裝。
關(guān)于編譯安裝的問(wèn)題這篇文章幫了我很大的忙 http://wangyan.org/blog/install-php-from-source.html 步驟如下:
- cd httpd-2.2.17/
- ./configure --prefix=/usr/local/apache (--prefix是安裝到哪個(gè)目錄,其他的就暫時(shí)不用了) 然后 make -> make install
- 再配置apache : 將httpd 加入系統(tǒng)變量中,即直接編輯/etc/environment文件,或者新建軟鏈接。建立軟鏈接命令如下: ln -s /usr/local/apache/bin/httpd /usr/local/bin
- 將apache加入開(kāi)機(jī)自啟動(dòng)項(xiàng): ln -s /usr/local/apache/bin/apachectl /etc/init.d/update-rc.d apachectl defaults OK,下面可以用 httpd -k start(或restart)對(duì)apache服務(wù)器進(jìn)行操作,至此,apache安裝完。
- cd php-5.2.16 ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs 后面還有很多項(xiàng)都是不太需要的... 然后 make -> make install
- 將Apache與PHP5聯(lián)系起來(lái),在些之前,需要將php5也加到系統(tǒng)的環(huán)境變量中 同樣方法,建立軟鏈接: ln -s /usr/local/php/bin/php /usr/local/binln -s /usr/local/php/bin/phpize /usr/local/bin (將phpize也加進(jìn)去,等下要用) 接下來(lái)設(shè)置apache的配置文件:/usr/local/apache/conf/httpd.conf 查找"AddType application/x-gzip .gz .tgz",在下面添加: AddType application/x-httpd-php .php 到此,php與apache的連接完成,可以試一下 重啟apache ,和運(yùn)行 php -i
?
接下來(lái)開(kāi)始我們真正的工作——開(kāi)發(fā)PHP C++擴(kuò)展 (以myext為例)
我們需要修改的就3個(gè)文件: config.m4 , myext.c , php_myext.h
再添加前端使用的php函數(shù)接口,這里接口名字可以和擴(kuò)展名字不一樣;例如下面添加php_mytest函數(shù):
# 在zend_function_entry 數(shù)組里面添加我們的自定義函數(shù) zend_function_entry matchCmd_functions[] = {PHP_FE(php_mytest,NULL) {NULL, NULL, NULL} /* Must be the last line in matchCmd_functions[] */ };在文件最后加入函數(shù)的實(shí)現(xiàn):
PHP_FUNCTION(php_mytest) {//to get and store the argumentschar *argv1= NULL ;char *argv2= NULL ; int arg1_len, arg2_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &argv1, &arg1_len,&argv2,&arg2_len) == FAILURE) {return;}//php_printf("argv1 :%s\n",argv1);//php_printf("argv2 :%s\n",argv2);double dValue = func_from_link_file(argv1,argv2) ;RETURN_DOUBLE(dValue) ; }?
?
如果提示沒(méi)裝autoconf,就apt-get install autoconf 裝上 ,這里會(huì)提示你的擴(kuò)展 .so文件在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/目錄下,
這樣可以一目了然的看到加載的到底是哪個(gè)php.ini文件 配置php.ini主要就是加上兩句,這里extension_dir可以加上,或者將.so文件移到你的擴(kuò)展目錄 extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613" extension=myext.so
轉(zhuǎn)載于:https://my.oschina.net/ifeixiang/blog/339385
總結(jié)
以上是生活随笔為你收集整理的总结一下php5.2.16与apache2.0的C++扩展开发整个过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java parallel contro
- 下一篇: 异步和多线程的区别