在vs2008開發PHP擴充套件之一--基礎環境搭建
在linux開發PHP擴充套件相對windows配置容易的的多,但是有時候我們是用windows來做伺服器的,就不得不編譯用於windows版本的dll擴充套件。這裡講一下在vs2008下開發PHP擴充套件的環境搭建。大體思路如下(有的配置需要根據你的情況而定,所以下面的的步驟並不一定在你的PC上可以搭建成功。但是大體步驟是這樣,這裡只是拋磚引玉):
第一:準備工具
1.vs2008
2.php
php-5.3.8-src
http://windows.php.net/downloads/releases/php-5.3.8-src.zip
VC9 x86 Non Thread Safe
http://windows.php.net/downloads/releases/php-5.3.8-nts-Win32-VC9-x86.zip
VC9 x86 Thread Safe
http://windows.php.net/downloads/releases/php-5.3.8-Win32-VC9-x86.zip
使用ISAPI的方式來執行PHP就用Thread Safe(執行緒安全)的版本
使用FastCGI模式執行PHP的話就沒有必要用執行緒安全檢查了,用None Thread Safe(NTS,非執行緒安全)的版本能夠更好的提高效率。
3.必要庫
http://www.php.net/extra/bindlib_w32.zip
http://www.php.net/extra/win32build.zip
第二:步步為營搭建開發環境
我這裡沒有用到cygwin,因為我的開發只是一個很簡單的demo,沒有使用第三方了類庫。如果是把linux下拿過來的擴充套件專案,可能用到一些庫。可能用cygwin會比較好。但是沒有cygwin完全可以在window下開發。具體如下:
1.目錄結構:
F:\php_win
F:\php_win>dir
F:\php_win 的目錄
2011-11-23 21:56 <DIR> php-5.3.8
2011-11-23 20:43 <DIR> php-5.3.8-nts-Win32-VC9-x86
2011-11-18 14:19 15,659,969 php-5.3.8-nts-Win32-VC9-x86.zip
2011-11-23 15:07 20,745,577 php-5.3.8-src.zip
2011-11-23 21:51 <DIR> win32build
我把第三方包都放到合併到一起放在win32build目錄下。你可以根據情況而定
2.安裝vs2008這裡就不多說了
我的安裝在C:\vc資料夾下面。
3.配置PATH
安裝完成vs2008,有的編譯命令可能不能直接執行。加入PATH,可以避免這個問題。
這裡有兩個目錄要注意
一個是C:\vc\vc2008compiler\bin
下面有cl.exe\link.exe等等
第二個是C:\vc\Microsoft Visual\VC2008 Professional Edition\SDK\V6.0A\bin
把他們加入到PATH環境變數中。
4.建立配置PHP開發環境。
(1)。lamp開發環境,因為我們可能會用到php.exe來執行一些指令碼。
(2)。PHP二次開發環境。PHP開發環境的配置很繁瑣,但是官方提供了shell指令碼,讓我們可以來快速的構建一個可以用的PHP二次開發環境。
進入F:\php_win\php-5.3.8>。執行cl,確保能夠執行。具體如下:
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>cl
用於 80x86 的 Microsoft (R) 32 位 C/C++ 優化編譯器 15.00.21022.08 版
版權所有(C) Microsoft Corporation。保留所有權利。
用法: cl [ 選項... ] 檔名... [ /link 連結選項... ]
C:\Documents and Settings\Administrator>f:
F:\>cd php_win
F:\php_win>cd php-5.3.8
F:\php_win\php-5.3.8>buildconf
Rebuilding configure.js
Now run 'configure --help'
F:\php_win\php-5.3.8>cscript /nologo configure.js --with-php-build="F:\php_win\win32build" --without-libxml --disable-o
dbc
Saving configure options to config.nice.bat
Checking for cl.exe ... <in default path>
Detected compiler MSVC9 (Visual C++ 2008)
Detected 32-bit compiler
Checking for link.exe ... D:\cygwin\bin
Checking for nmake.exe ... <in default path>
Checking for lib.exe ... <in default path>
Checking for bison.exe ... F:\php_win\win32build\bin
Checking for re2c.exe ... <not found>
Parsers will not be regenerated
Checking for zip.exe ... <not found>
Checking for lemon.exe ... <not found>
Checking for mc.exe ... C:\vc\Microsoft Visual\VC2008 Professional Edition\SDK\V6.0A\bin
Checking for mt.exe ... C:\vc\vc2008compiler\bin
Build dir: Release_TS
PHP Core: php5ts.dll and php5ts.lib
Checking for wspiapi.h ... <not found>
Checking for wspiapi.h ... <not found>
Enabling SAPI sapi\cgi
Enabling SAPI sapi\cli
Enabling extension ext\bcmath
Enabling extension ext\calendar
Checking for library oleaut32.lib ... <not found>
Enabling extension ext\com_dotnet
Checking for mscoree.h ... <not found>
Checking for mscoree.h ... <not found>
Enabling extension ext\ctype
Enabling extension ext\date
Enabling extension ext\ereg
Enabling extension ext\filter
Enabling extension ext\ftp
Checking for library libjpeg_a.lib;libjpeg.lib ... <not found>
WARNING: gd not enabled; libraries and headers not found
Enabling extension ext\hash
Checking for library libiconv_a.lib ... <not found>
Checking for library libiconv.lib ... <not found>
Checking for library iconv_a.lib ... <not found>
Checking for library iconv.lib ... <not found>
WARNING: iconv support can't be enabled, libraries or headers are missing
Enabling extension ext\json
Checking for library ws2_32.lib ... <not found>
Enabling extension ext\pcre
Enabling extension ext\reflection
Enabling extension ext\session
Enabling extension ext\spl
Checking for timelib_config.h ... ext/date/lib
Enabling extension ext\standard
Enabling extension ext\tokenizer
Checking for zlib.h ... F:\php_win\win32build\include
Enabling extension ext\zip
Checking for library zlib_a.lib;zlib.lib ... ..\win32build\lib\zlib.lib
Checking for zlib.h ... F:\php_win\win32build\include
Enabling extension ext\zlib
WARNING: dom support can't be enabled, libxml is not enabled
Enabling extension ext\phar
Native OpenSSL support in Phar disabled
WARNING: simplexml not enabled; libraries and headers not found
WARNING: xml support can't be enabled, libraries or headers are missing
Creating build dirs...
Generating files...
Generating Makefile
Generating main/internal_functions.c
Generating main/config.w32.h
Generating phpize
Done.
Enabled extensions:
-----------------------
| Extension | Mode |
-----------------------
| bcmath | static |
| calendar | static |
| com_dotnet | static |
| ctype | static |
| date | static |
| ereg | static |
| filter | static |
| ftp | static |
| hash | static |
| json | static |
| pcre | static |
| phar | static |
| reflection | static |
| session | static |
| spl | static |
| standard | static |
| tokenizer | static |
| zip | static |
| zlib | static |
-----------------------
Enabled SAPI:
-------------
| Sapi Name |
-------------
| cgi |
| cli |
-------------
-------------------------------------------
| | |
-------------------------------------------
| Build type | Release |
| Thread Safety | Yes |
| Compiler | MSVC9 (Visual C++ 2008) |
| Architecture | x86 |
-------------------------------------------
Type 'nmake' to build PHP
F:\php_win\php-5.3.8>
如果出現上類似的提示, 說明你的PHP開發環境已經搭建成功。如果執行腳步提示錯誤,你可以搜尋錯誤訊息,具體解決。從上面的不難看出一些很重要的資訊。
其實最主要的就是生成config.w32.h。即PHP開發環境的配置檔案。如果沒有這個指令碼,windows下開發php,簡直太悲慘了。
5.開發PHP擴充套件的方法。
到這裡我們就可以建立開發PHP擴充套件了,但是無從下手,我們該怎麼辦,其實PHP也給我們提供了很好用的工具來建立一個PHP擴充套件的骨架。就是用F:\php_win\php-5.3.8\ext下的ext_skel_win32.php
如何執行,以php結尾,說明依賴php。下面看具體方法,我建立一個名為’test‘的擴充套件。
這裡要確保你的php.exe可以直接在cmd下使用,具體還是加入Path路徑。
雖然有ext_skel_win32.php,用php執行,但是我們不知道具體的內容。
其實執行如下命令:
F:\php_win\php-5.3.8\ext>php ext_skel_win32.php
ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]
[--skel=dir] [--full-xml] [--no-help]
--extname=module module is the name of your extension
--proto=file file contains prototypes of functions to create
--stubs=file generate only function stubs in file
--xml generate xml documentation to be added to phpdoc-cvs
--skel=dir path to the skeleton directory
--full-xml generate xml documentation for a self-contained extension
(not yet implemented)
--no-help don't try to be nice and create comments in the code
and helper functions to test if the module compiled
Warning: fopen(/.php): failed to open stream: No such file or directory in F:\php_win\php-5.3.8\ext\ext_skel_win32.php o
n line 52
F:\php_win\php-5.3.8\ext>
可以看到如何使用這php指令碼。大體命令如下
F:\php_win\php-5.3.8\ext>php ext_skel_win32.php --extname=test
Creating directory test
Creating basic files: config.m4 config.w32 .svnignore test.c php_test.h CREDITS EXPERIMENTAL tests/001.phpt test.php [do
ne].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/test/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-test
5. $ make
6. $ ./php -f ext/test/test.php
7. $ vi ext/test/test.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/test/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
F:\php_win\php-5.3.8\ext>
這樣就成功建立了一個php擴充套件骨架,你可以在裡面修改。具體的還要好好研究PHP API。具體擴充套件的位置就在ext目錄下,開啟可以看到test資料夾,這就是剛才命令建立的。
F:\php_win\php-5.3.8\ext\test 的目錄
2011-11-29 16:57 <DIR> .
2011-11-29 16:57 <DIR> ..
2011-11-29 16:57 16 .svnignore
2011-11-29 16:57 1,970 config.m4
2011-11-29 16:57 282 config.w32
2011-11-29 16:57 4 CREDITS
2011-11-29 16:57 0 EXPERIMENTAL
2011-11-29 16:57 2,768 php_test.h
2011-11-29 16:57 5,128 test.c
2011-11-29 16:57 4,954 test.dsp
2011-11-29 16:57 500 test.php
2011-11-29 16:57 <DIR> tests
9 個檔案 15,622 位元組
3 個目錄 7,441,883,136 可用位元組
F:\php_win\php-5.3.8\ext\test>
這樣一個php擴充套件的框架已經建立完成了。下面就是配置使用vs2008開發這個擴充套件。後續文章講解。