windows停製作PHP擴充
來源:互聯網
上載者:User
windows下製作PHP擴充
windows下製作PHP擴充
2011年01月26日
轉自:http://demon.tw/software/compile-php-on-windows.ht ml
編譯PHP擴充必需的一些標頭檔需要從php源碼中擷取,其中有一些配置性的標頭檔,需要做到下面第8步之後,也就是說php伺服器程式可以使用別人已經編譯好的安裝包。 最近在學習編寫PHP拓展,懶得裝Linux,就研究了一下在Windows下編譯PHP的方法,總算搭建好了在Windows下開發PHP拓展的環境。
1、在C盤建立一個檔案夾,C:\PHPDEV
2、從官網下載最新版(我這裡用的是5.2.14)的PHP源碼,將下tar.gz或tar.bz2壓縮包儲存到C:\PHPDEV,解壓到當前檔案夾
3、下載php win32 build extras並儲存到C:\PHPDEV,解壓到當前檔案夾
4、擷取編譯好的bison.exe和flex.exe,儲存到案頭或者其他C:\PHPDEV以外的地方。分別開啟壓縮包並進入bin檔案夾,將bison.exe和flex.exe複製到C:\Windows檔案夾
5、假定你已經安裝了Visual Studio 2008(我個人不推薦用Visual Studio 2008,推薦使用Platform SDK Febrary 2003,官方的編譯版本就是用這個PSDK編譯的,但是這裡用Visual Studio 2008做說明),開始菜單->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 Command Prompt,開啟Visual Studio 2008命令提示行
6、用cd命令將目錄切換到C:\PHPDEV\php-5.2.14
7、輸入buildconf.bat,斷行符號。這個批處理的作用是搜尋所有的.w32檔案並為你建立configure.js
8、輸入下面的命令
cscript /nologo configure.js without-xml without-wddx without-simplexml without-dom without-libxml disable-zlib - without-sqlite disable-odbc disable-cgi enable-cli enable-debug without-iconv disable-ipv6
為什麼要disable和without那麼多功能呢?因為這些功能需要的庫檔案並沒有包含在PHP的源碼包中(不然會很大),這些額外的庫檔案需要你自己去下載(要找全不是那麼容易的)。如果你不禁用這些功能,會出現編譯錯誤。
9、輸入nmake,斷行符號
10、第9步中可能會出現檔案的編碼錯誤,找到出現錯誤的檔案,用EditPlus選擇Western European (Windows)編碼開啟後另存新檔utf-8編碼,重寫nmake即可
11、編譯好以後切換到C:\PHPDEV\php-5.2.6\Debug_TS,測試一下
php -r "echo 'hello,world';"
二、windows下開發PHP擴充
轉自:http://blog.csdn.net/linvo/archive/2009/04/17/4086 909.aspx
第一步:準備
1、php源碼包和windows下的二進位包,以及安裝Visual C++,並把Microsoft Visual Studio\Common\MSDev98\Bin的絕對路徑添加到windows環境變數
2、解壓源碼包到d:\php_src
3、進入d:\php_src\ext目錄,複製skeleton檔案夾,並重新命名為要開發擴充的名字,本例為"linvo"
4、把二進位包中dev目錄下的php5ts.lib檔案,拷入建立的linvo目錄
5、編輯linvo目錄中的php_skeleton.h、skeleton.c、skeleton.dsp這三個檔案,替換內容中所有extname為linvo,EXTNAME為LINVO。(嚴格區分大小寫)
第二步:編碼
6、編輯php_skeleton.h檔案(標頭檔)
在PHP_FUNCTION(confirm_linvo_compiled);下面編寫
PHP_FUNCTION(hello);
聲明一個hello函數
7、編輯skeleton.c檔案(主檔案)
在PHP_FE(confirm_linvo_compiled, NULL) 下面編寫
PHP_FE(hello, NULL)
這是函數入口,下面該寫函數主體了
找到PHP_FUNCTION(confirm_test_compiled)函數,該函數是測試函數,在該函數後面新寫一個函數
PHP_FUNCTION(hello)
{
char *arg = NULL;
int arg_len, len;
char *strg;
/* 接收參數 */
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
len = spprintf(&strg, 0, "Hello,%s", arg);
RETURN_STRINGL(strg, len, 0);
}
第三步:編譯
8、運行cmd命令列,進入d:\php_src\ext\linvo目錄
9、輸入 msdev linvo.dsp /MAKE "linvo - Win32 Release_TS"
10、如果沒有錯誤,則在php_src目錄下會產生一個Release_TS檔案夾,裡面就是編譯好的php_linvo.dll擴充
第四步:使用
11、將其拷入運行環境中的php擴充目錄ext
12、編輯php.ini添加extension=php_linvo.dll,重啟apache
13、在php檔案中執行如下語句
echo hello('Linvo');
將輸出
Hello,Linvo
14、通過echo phpinfo();也可看到擴充已載入的資訊
linvo
linvo support enabled
三、載入問題
當產生的擴充放到檔案夾中,並且修改了php.ini之後有可能出現產生的擴充dll並沒有被php載入,可以從以下幾個方面進行檢查。
1、建立一個php,並且使用phpinfo()函數打出當前php資訊,找到php中真實載入的php.ini。
2、是否已經重啟過apache。
3、查看apache的錯誤記錄檔,看出現的有沒有關於載入擴充出錯的一些資訊。 如果出現"PHP Warning: PHP Startup: extname: Unable to initialize module\nModule compiled with module API=20090626, debug=0, thread-safety=1\nPHP compiled with module API=20060613, debug=0, thread-safety=1\nThese options need to match\n in Unknown on line 0"這樣的提示,說明編譯時間使用源碼版本與php的應用程式不符合(並未要求完全一致的版本) ,如果出現不符合。
4、寫擴充時是否引用了其它dll,對於此種問題原因,詳見:
http://www.guyzyl.com/post-37.html