日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

总结一下php5.2.16与apache2.0的C++扩展开发整个过程

發布時間:2025/7/14 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 总结一下php5.2.16与apache2.0的C++扩展开发整个过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

開發環境:ubuntu 11(虛擬機環境) 開發平臺: php-5.2.16.tar+apache2.0

PHP API 20041225 PHP Extension 20060613 Zend Extension 220060519

說明一下為什么要用這么舊的版本,沒原因,因為公司官方服務器是用這個版本...

之前用php5.3.10穩定版本已經做過一次,可是移植到php5.2.16上卻用不了。發現原因應該是PHP與ZEND API不同!所以開發擴展時版本一定要一致啊! 一致的意思是:都是PHP5.2.X 或 PHP5.3.X 等等...

一:安裝開發環境 如果用ubuntu自身的apt-get install 來安裝apache與php的話不一定是你需要開發的版本!

所以還是要自己下載源代碼編譯安裝。

關于編譯安裝的問題這篇文章幫了我很大的忙 http://wangyan.org/blog/install-php-from-source.html 步驟如下:

  • 下載源代碼,建立好文件夾解壓 ,例如我解壓在 /home/fei/phpex/apache ,/home/fei/phpex/php5.2.16
  • 先安裝apache,
    • cd httpd-2.2.17/
    • ./configure --prefix=/usr/local/apache (--prefix是安裝到哪個目錄,其他的就暫時不用了) 然后 make -> make install
    • 再配置apache : 將httpd 加入系統變量中,即直接編輯/etc/environment文件,或者新建軟鏈接。建立軟鏈接命令如下: ln -s /usr/local/apache/bin/httpd /usr/local/bin
    • 將apache加入開機自啟動項: ln -s /usr/local/apache/bin/apachectl /etc/init.d/update-rc.d apachectl defaults OK,下面可以用 httpd -k start(或restart)對apache服務器進行操作,至此,apache安裝完。
    再看PHP的安裝:
    • cd php-5.2.16 ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs 后面還有很多項都是不太需要的... 然后 make -> make install
    • 將Apache與PHP5聯系起來,在些之前,需要將php5也加到系統的環境變量中 同樣方法,建立軟鏈接: ln -s /usr/local/php/bin/php /usr/local/binln -s /usr/local/php/bin/phpize /usr/local/bin (將phpize也加進去,等下要用) 接下來設置apache的配置文件:/usr/local/apache/conf/httpd.conf 查找"AddType application/x-gzip .gz .tgz",在下面添加: AddType application/x-httpd-php .php 到此,php與apache的連接完成,可以試一下 重啟apache ,和運行 php -i

    ?

    接下來開始我們真正的工作——開發PHP C++擴展 (以myext為例)

    我們需要修改的就3個文件: config.m4 , myext.c , php_myext.h

  • 進入到php源代碼目錄ext目錄下, cd /home/fei/phpex/php-5.2.16/ext/ 運行: ./ext_skel --extname=myext ext目錄下會生成一個myext的文件夾
  • 修改 config.m4 文件,去掉這三行的dnl注釋(搜索PHP_ARG_ENABLE) PHP_ARG_ENABLE(myext, whether to enable myext support,Make sure that the comment is aligned:[ --enable-myext Enable myext support]) 再在最后面加上C++的庫引用聲明: (注意第二,三行,改成你自己的擴展的名字,大寫,還有第五行) PHP_REQUIRE_CXX()PHP_SUBST(MYEXT_SHARED_LIBADD)PHP_ADD_LIBRARY_WITH_PATH(stdc++, "", MYEXT_SHARED_LIBADD)PHP_ADD_LIBRARY(stdc++,EXTRA_LDFLAGS)PHP_NEW_EXTENSION(, myext.cpp, $ext_shared)
  • 將myext.c重命名為myext.cpp ,修改內容: #原代碼 , 將下面的代碼用extern C包含 #ifdef HAVE_CONFIG_H #include "config.h" #endif#include "php.h" #include "php_ini.h" #include "ext/standard/info.h"#改為 extern "C" { #ifdef HAVE_CONFIG_H #include "config.h" #endif#include "php.h" #include "php_ini.h" #include "ext/standard/info.h" } #include "php_matchCmd.h"# 這里可以自主加入你需要包含的文件,例如 #include "link_file.cpp"

    添加前端使用的php函數接口,這里接口名字可以和擴展名字不一樣;例如下面添加php_mytest函數:

    # 在zend_function_entry 數組里面添加我們的自定義函數 zend_function_entry matchCmd_functions[] = {PHP_FE(php_mytest,NULL) {NULL, NULL, NULL} /* Must be the last line in matchCmd_functions[] */ };

    在文件最后加入函數的實現

    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) ; }

    ?

  • 在php_myext.h加入php的函數聲明,和上面函數名一樣 PHP_MINIT_FUNCTION(myext); PHP_MSHUTDOWN_FUNCTION(myext); PHP_RINIT_FUNCTION(myext); PHP_RSHUTDOWN_FUNCTION(myext); PHP_MINFO_FUNCTION(myext); #在下面加入一行函數聲明 PHP_FUNCTION(php_mytest);

    ?

  • 運行 phpize (后面可能用phpize --clean清理) ./configure --with-php-config=/usr/local/php/bin/php-config make make install

    如果提示沒裝autoconf,就apt-get install autoconf 裝上 ,這里會提示你的擴展 .so文件在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/目錄下,

  • 接下來要配置php.ini文件。這里建議大家先寫一個測試文件
    這樣可以一目了然的看到加載的到底是哪個php.ini文件 配置php.ini主要就是加上兩句,這里extension_dir可以加上,或者將.so文件移到你的擴展目錄 extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613" extension=myext.so
  • 重啟apache : httpd -k restart , 將myext文件夾下的myext.php(運行第一步命令時自動生成的)復制到www文件夾下 瀏覽即可看到模塊加載的消息 。
  • 轉載于:https://my.oschina.net/ifeixiang/blog/339385

    總結

    以上是生活随笔為你收集整理的总结一下php5.2.16与apache2.0的C++扩展开发整个过程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。