设为首页 收藏本站
查看: 702|回复: 0

[经验分享] VC 建立php扩展

[复制链接]

尚未签到

发表于 2017-3-21 09:18:45 | 显示全部楼层 |阅读模式
  软件 php的源文件和安装包要一致
  php5.3.8(VC9 x86 Thread Safe)

php5.3.8源文件(tar.bz2)

VC
  bison.exe

  MSYS(MSYS类似于Cygwin,但是由于工作原理的不同,速度更快、体积更小、功能强大、便于携带http://code.google.com/p/msys-cn/)
  因为我的开发只是一个很简单的demo,没有使用第三方了类库。如果是把linux下拿过来的扩展项目,可能用到一些库。可能用cygwin会比较好。但是没有cygwin完全可以在window下开发。
  1。解压下载到的源文件包tar.bz2包到C盘c:/phpsrc,并且解压php安装包(VC9 x86Thread Safe,也就是能够正常使用的php压缩包文件)到C:/php,我们只需要里面的一个文件C:/php/dev/
php5.lib,复制php5.lib到c:/phpsrc。
  2。复制bison.exe到Microsoft Visual Studio\Common\MSDev98\Bin把Microsoft Visual Studio\Common\MSDev98\Bin的绝对路径添加到windows环境变量
  3
.在这里我们开始生成生成config.w32.h。CMD在里面操作
  进入:c:/phpsrc执行

C:\phpsrc>buildconf
Rebuilding configure.js
Now run 'configure --help'
  建立一个临时环境变量

C:\phpsrc>set path=%path%;C:/phpsrc/bin
C:\phpsrc>cscript /nologo configure.js --with-php-build="../phpsrc" --without-libxml --disable-odbc
  如果想要Non Thread Safe 模式就去掉上面的命令最后的参数--disable-zts


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 ...  C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN
Checking for nmake.exe ...  <in default path>
Checking for lib.exe ...  <in default path>
...........中间省略.............
-------------------------------------------
|               |                         |
-------------------------------------------
| Build type    | Release                 |
| Thread Safety | Yes                     |
| Compiler      | MSVC6 (Visual C++ 6.0)  |
| Architecture  | x86                     |
-------------------------------------------
Type 'nmake' to build PHP
  如果出现上类似的提示, 说明你的PHP开发环境已经搭建成功,同时在main下面多了一个 config.w32.h。即PHP开发环境的配置文件。如果没有这个脚本,windows下开发php,简直太悲惨了。
  4.开发PHP扩展的方法

  到这里我们就可以建立开发PHP扩展了,但是无从下手,我们该怎么办,其实PHP也给我们提供了很好用的工具来建立一个PHP扩展的骨架。就是用C:\phpsrc\ext下的ext_skel_win32.php如何运行,以php结尾,说明依赖php。下面看具体方法,我建立一个名为’test‘的扩展。这里要确保你的php.exe可以直接在cmd下使用,具体还是加入Path路径
。虽然有ext_skel_win32.php,用php执行,但是我们不知道具体的内容。
其实执行如下命令:

C:\phpsrc\ext>php ext_skel_win32.php
'sh' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
  ext_skel_win32.php源码中说要使用cygwin,但我机器上没有装cygwin,另外发现其中实际上只使用到了sh,而我机器上装的MSYS里也有sh,应该可以用的吧,于是就将ext_skel_win32.php中的$cygwin_path变量设置成了MSYS的BIN目录

$cygwin_path = 'c:\msys\1.0\bin';
 
C:\phpsrc\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
PHP Warning:  fopen(/.php): failed to open stream: No such file or directory in
C:\phpsrc\ext\ext_skel_win32.php on line 52
C:\phpsrc\ext>
  可以看到如何使用这php脚本。大体命令如下

c:\phpsrc\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.
c:\phpsrc\ext>
  这样就成功创建了一个php扩展骨架
,你可以在里面修改。具体的还要好好研究PHP API。具体扩展的位置就在ext目录下,打开可以看到test文件夹,这就是刚才命令创建的。

C:\phpsrc\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 可用字节
C:\phpsrc\ext\test>
  这样一个php扩展的框架已经创建完成了。


  下面就是配置使用vc++6开发这个扩展


  III. 添加依赖的php5ts.lib



  在php的二进制包中的 dev目录下将 php5ts.lib 拷到我们的test目录中, 否则编译将通不过。
IV. 添加test c代码



生成的test目录中有关键文件包括

  test.dsp,

  test.c,

  php_test.h,

其他文件暂时不必关心.


提示:切忌test目录不可以挪移出ext目录,否则会编译报缺少php.h.


1. 修改php_test.h

扩展的新函数: 在PHP_FUNCTION(confirm_test_compiled); 行后添加一行

PHP_FUNCTION(confirm_test_compiled);
PHP_FUNCTION(test);  // 新增的行
  2. 修改test.c

在PHP_FUNCTION(confirm_test_compiled) 后添加我们的新函数

PHP_FUNCTION(test){
php_printf("Hello C extension");
}
  在数组zend_function_entry test_functions[]增加一行


const zend_function_entry test_functions[] = {
PHP_FE(confirm_test_compiled,NULL)/* For testing, remove later. */
PHP_FE(test, NULL) // 新增的行
PHP_FE_END/* Must be the last line in test_functions[] */
};
  V. 构建DLL文件


  
用vc6打开我们的工程,就是test.dsp


1. 修改编译方式为release: 选择Build->Set Active Configuration设置默认编译方式为Release, 否则会提示缺少php5ts_debug.lib ,其实就是php5ts.lib。

2. 按F5编译。会在ext上级的Release_TS目录下生成php_test.dll
  提示:如果愿意使用命令行编译也是可以的,命令如下:


msdev test\test.dsp /MAKE "test - Win32 Release_TS"
  VI. 集成dll到php中。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-352782-1-1.html 上篇帖子: PHP画图基础 下篇帖子: 广州学php要多久?php培训哪家好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表