VC 建立php扩展

简介:

软件 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执行

Java代码   收藏代码
  1. C:\phpsrc>buildconf  
  2. Rebuilding configure.js  
  3. Now run 'configure --help'  

 建立一个临时环境变量

Java代码   收藏代码
  1. C:\phpsrc>set path=%path%;C:/phpsrc/bin  
  2.   
  3. C:\phpsrc>cscript /nologo configure.js --with-php-build="../phpsrc" --without-libxml --disable-odbc  

如果想要Non Thread Safe 模式就去掉上面的命令最后的参数--disable-zts

Java代码   收藏代码
  1. Saving configure options to config.nice.bat  
  2. Checking for cl.exe ...  <in default path>  
  3.   Detected compiler MSVC9 (Visual C++ 2008)  
  4.   Detected 32-bit compiler  
  5. Checking for link.exe ...  C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN  
  6. Checking for nmake.exe ...  <in default path>  
  7. Checking for lib.exe ...  <in default path>  
  8. ...........中间省略.............  
  9. -------------------------------------------  
  10. |               |                         |  
  11. -------------------------------------------  
  12. | Build type    | Release                 |  
  13. | Thread Safety | Yes                     |  
  14. | Compiler      | MSVC6 (Visual C++ 6.0)  |  
  15. | Architecture  | x86                     |  
  16. -------------------------------------------  
  17.   
  18. 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执行,但是我们不知道具体的内容。 其实执行如下命令:

Java代码   收藏代码
  1. C:\phpsrc\ext>php ext_skel_win32.php  
  2. 'sh' 不是内部或外部命令,也不是可运行的程序  
  3. 或批处理文件。  

ext_skel_win32.php源码中说要使用cygwin,但我机器上没有装cygwin,另外发现其中实际上只使用到了sh,而我机器上装的MSYS里也有sh,应该可以用的吧,于是就将ext_skel_win32.php中的$cygwin_path变量设置成了MSYS的BIN目录

Java代码   收藏代码
  1. $cygwin_path = 'c:\msys\1.0\bin';  
 
Java代码   收藏代码
  1. C:\phpsrc\ext>php ext_skel_win32.php  
  2. ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]  
  3.            [--skel=dir] [--full-xml] [--no-help]  
  4.   
  5.   --extname=module   module is the name of your extension  
  6.   --proto=file       file contains prototypes of functions to create  
  7.   --stubs=file       generate only function stubs in file  
  8.   --xml              generate xml documentation to be added to phpdoc-cvs  
  9.   --skel=dir         path to the skeleton directory  
  10.   --full-xml         generate xml documentation for a self-contained extension  
  11.                      (not yet implemented)  
  12.   --no-help          don't try to be nice and create comments in the code  
  13.                      and helper functions to test if the module compiled  
  14.   
  15. PHP Warning:  fopen(/.php): failed to open stream: No such file or directory in  
  16. C:\phpsrc\ext\ext_skel_win32.php on line 52  
  17.   
  18. C:\phpsrc\ext>  

 可以看到如何使用这php脚本。大体命令如下

Java代码   收藏代码
  1. c:\phpsrc\ext>php ext_skel_win32.php  --extname=test  
  2. Creating directory test  
  3. Creating basic files: config.m4 config.w32 .svnignore test.c php_test.h CREDITS EXPERIMENTAL tests/001.phpt test.php [do  
  4. ne].  
  5.   
  6. To use your new extension, you will have to execute the following steps:  
  7.   
  8. 1.  $ cd ..  
  9. 2.  $ vi ext/test/config.m4  
  10. 3.  $ ./buildconf  
  11. 4.  $ ./configure --[with|enable]-test  
  12. 5.  $ make  
  13. 6.  $ ./php -f ext/test/test.php  
  14. 7.  $ vi ext/test/test.c  
  15. 8.  $ make  
  16.   
  17. Repeat steps 3-6 until you are satisfied with ext/test/config.m4 and  
  18. step 6 confirms that your module is compiled into PHP. Then, start writing  
  19. code and repeat the last two steps as often as necessary.  
  20.   
  21. c:\phpsrc\ext>  

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

Java代码   收藏代码
  1. C:\phpsrc\ext\test 的目录  
  2.   
  3. 2011-11-29  16:57    <DIR>          .  
  4. 2011-11-29  16:57    <DIR>          ..  
  5. 2011-11-29  16:57                16 .svnignore  
  6. 2011-11-29  16:57             1,970 config.m4  
  7. 2011-11-29  16:57               282 config.w32  
  8. 2011-11-29  16:57                 4 CREDITS  
  9. 2011-11-29  16:57                 0 EXPERIMENTAL  
  10. 2011-11-29  16:57             2,768 php_test.h  
  11. 2011-11-29  16:57             5,128 test.c  
  12. 2011-11-29  16:57             4,954 test.dsp  
  13. 2011-11-29  16:57               500 test.php  
  14. 2011-11-29  16:57    <DIR>          tests  
  15.                9 个文件         15,622 字节  
  16.                3 个目录  7,441,883,136 可用字节  
  17.   
  18. 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); 行后添加一行

Java代码   收藏代码
  1. PHP_FUNCTION(confirm_test_compiled);  
  2. PHP_FUNCTION(test);  // 新增的行  

2. 修改test.c
在PHP_FUNCTION(confirm_test_compiled) 后添加我们的新函数

Java代码   收藏代码
  1. PHP_FUNCTION(test){  
  2.     php_printf("Hello C extension");  
  3. }  

在数组zend_function_entry test_functions[]增加一行

Java代码   收藏代码
  1. const zend_function_entry test_functions[] = {  
  2.     PHP_FE(confirm_test_compiled,   NULL)       /* For testing, remove later. */  
  3.     PHP_FE(test, NULL) // 新增的行  
  4.     PHP_FE_END  /* Must be the last line in test_functions[] */  
  5. };  

 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

提示:如果愿意使用命令行编译也是可以的,命令如下:

Java代码   收藏代码
  1. msdev test\test.dsp /MAKE "test - Win32 Release_TS"   

 VI. 集成dll到php中。

相关文章
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
66 4
|
2月前
|
NoSQL 安全 Linux
MongoDB PHP 扩展
10月更文挑战第19天
13 0
MongoDB PHP 扩展
|
3月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
4月前
|
安全 前端开发 PHP
PHP与现代Web开发:构建高效和可扩展的应用程序
【8月更文挑战第29天】在这篇文章中,我们将深入探讨PHP如何适应现代Web开发的需求。我们将通过实际案例分析,揭示PHP的核心优势,并展示如何利用这些优势来构建高性能、可扩展的Web应用。文章不仅提供理论知识,还包括具体的代码示例,旨在帮助开发者更好地理解和运用PHP解决实际问题。
|
4月前
|
SQL 关系型数据库 MySQL
PHP与数据库交互的艺术:深入探讨PDO扩展
【8月更文挑战第28天】在数字信息时代的海洋里,PHP作为一艘灵活的帆船,承载着无数网站和应用的梦想。而PDO扩展,则是这艘帆船上不可或缺的导航仪,指引着数据安全与效率的航向。本文将带你领略PHP与数据库交互的艺术,深入浅出地探索PDO的世界,从连接数据库到执行复杂的查询,每一步都清晰可见。我们将一起航行在这段奇妙的旅程上,解锁数据的奥秘,体验编程的乐趣。
69 1
|
4月前
|
存储 安全 Linux
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
|
5月前
|
运维 Serverless API
函数计算产品使用问题之如何使用PHP Runtime非内置扩展
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
Ubuntu 中间件 Linux
linux php添加扩展zip libzip ZipArchive功能
linux php添加扩展zip libzip ZipArchive功能
207 1
|
6月前
|
Ubuntu 关系型数据库 MySQL
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
91 0
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
|
7月前
|
编译器 API PHP
深入PHP扩展开发:打造高效自定义模块
【4月更文挑战第30天】 在追求性能优化和特定功能实现的道路上,PHP提供了一种强大机制——扩展。本文将引导读者通过编写一个简单的PHP扩展来探索扩展开发的世界。我们将涉及从环境搭建到代码实现,再到扩展的编译与加载的完整流程,确保读者能够理解并实践如何创建高效的自定义PHP模块。