1 简介
PHP 尽管提供了大量有用的函数,但是在特殊情况下还可能需要进行扩展编程,比如大量的 PECL(PHP Extension CommunityLibrary)就是以扩展的形式提供的(动态链接库dll文件),它们比 PEAR 的运行效率要高很多。
PHP 扩展是用 C 或 C++ 编写的,需要编译成动态连接库 dll 文件后在 PHP 环境下注册后才能使用。
编写 PHP 扩展的软件要求:VC++6.0 或 VC++.NET 环境。PHP 的源代码,需要编译。如果不愿意编译 PHP 的源代码,可以再下载 PHP 的已经编译成功的二进制代码(就是我们部署 PHP 运行环境的那些文件包)。注意分别下载的源文件包和已编译包,它们的版本必须一致。
2 操作步骤(假设你是个PHP开发人员)
2.1 下载php源码
下载的源码不能比你本机安装的PHP版本高,否则可能出现生成的dll无法别识别。
2.2 下载cygwin,并安装。
如果你的cygwin没有安装在c:\cygwin,进入php源码包\ext目录下,修改ext_skel_win32.php :
$cygwin_path = 'c:\cygwin\bin';
修改为你的cygwin目录
$cygwin_path = 'd:\cygwin\bin';
2.3 生成config.w32.h(如果源码的main目录下没有的话)
1. 下载2个必要的包
http://www.php.net/extra/bindlib_w32.zip
http://www.php.net/extra/win32build.zip
2. 把这2个包的内容放一起,解压缩到X:\win32build,X是你的硬盘分区。将X:\win32build\bin加入系统环境变量。
3. 命令行输入:set path=%path%;X:\win32build\bin
4. 然后进入到php源码根目录执行buildconf.bat
提示:
Rebuilding configure.js
Now run 'cscript /nologo configure.js --help'
5. 执行:
cscript /nologo configure.js --with-php-build="../win32build" --without-libxml --disable-odbc
上面的参数务必补齐,不然出现一些错误也麻烦。注意红色的字为你的win32源文件存放的路径,等到
出现
Creating build dirs...
Generating files...
Generating Makefile
Generating main/internal_functions.c
Generating main/config.w32.h
Done.
config.w32.h就成功生成了
2.4 执行生成扩展框架的指令
命令行方式进入源码的ext目录然后运行:
php ext_skel_win32.php --extname=myhello
(当然,为了保证上面的命令行能正常运行,首先你得确保你的php目录在系统的环境变量里)
2.5 添加依赖的php5ts.lib
在php的二进制包中的 dev目录下将 php5ts.lib 拷到我们的myhello目录中, 否则编译将通不过。
2.6 添加hello c代码
生成的myhello目录中有关键文件包括
myhello.dsp,
myhello.c,
php_myhello.h,
其他文件暂时不必关心.
提示:切忌myhello目录不可以挪移出ext目录,否则会编译报缺少php.h.
2.6.1 修改php_myhello.h
扩展的新函数: 在PHP_FUNCTION(confirm_myhello_compiled);行后添加一行 C代码
PHP_FUNCTION(confirm_myhello_compiled);
PHP_FUNCTION(myhello); // 新增的行
2.6.2 修改myhello.c
在PHP_FUNCTION(confirm_myhello_compiled)后添加我们的新函数
C代码
PHP_FUNCTION(myhello){
php_printf(”Hello C extension”);
}
在数组zend_function_entrymyhello_functions[]增加一行 C代码
zend_function_entry myhello_functions[] = {
PHP_FE(confirm_myhello_compiled, NULL) /* For testing, remove later. */
PHP_FE(myhello, NULL) // 新增的行
{NULL, NULL, NULL} /* Must be the last line in myhello_functions[] */
};
2.7 构建DLL文件
用vc6打开我们的工程,就是myhello.dsp
1. 修改编译方式为release: 选择Build->Set Active Configuration设置默认编译方式为Release, 否则会提示缺少php5ts_debug.lib,其实就是php5ts.lib。
2. 按F5编译。会在ext上级的Release_TS目录下生成php_myhello.dll
3. 提示:如果愿意使用命令行编译也是可以的,命令如下:
引用
msdev myhello\myhello.dsp /MAKE "myhello - Win32 Release_TS"
2.8 集成dll到php中
1. 把我们生成的 php_myhello.dll放到二进制php环境的ext目录下.
2. 然后修改php.ini, 添加extension=php_myhello.dll 重启apahce。
3. 新建c_test.php 内容为
<?php myhello(); ?>
在浏览器里打开会看到页面:
引用
hello C extension.
3 参考网站
http://koda.iteye.com/blog/315779 window下开发php扩展《重点参照》
http://hudeyong926.iteye.com/blog/1541602
http://blog.sina.com.cn/s/blog_4d06da1f0100pgmj.html
koda.iteye.com/blog/315779 出现的各种问题
http://blog.sina.com.cn/s/blog_4d06da1f0100pgmj.html
4 错误情况
4.1 关闭安全模式
Warning: putenv(): Safe Mode warning: Cannot set environmentvariable 'PATH' - i
t's not in the allowed list inF:\php-5.4.12-src\php-5.4.12-src\ext\ext_skel_win
32.php on line 22
Warning: fopen(): Unable to access ckinghello/ckinghello.dsp inF:\php-5.4.12-sr
c\php-5.4.12-src\ext\ext_skel_win32.php on line 45
Warning: fopen(ckinghello/ckinghello.dsp): failed to open stream: Noerror in F:
\php-5.4.12-src\php-5.4.12-src\ext\ext_skel_win32.php on line 45
Warning: fopen(): Unable to access ckinghello/ckinghello.php inF:\php-5.4.12-sr
c\php-5.4.12-src\ext\ext_skel_win32.php on line 52
Warning: fopen(ckinghello/ckinghello.php): failed to open stream: Noerror in F:
\php-5.4.12-src\php-5.4.12-src\ext\ext_skel_win32.php online 52