windows下PHP扩展

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值