如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

本文概述

  • 要求
  • 1.准备Visual Studio环境
  • 2.打开Visual Studio命令提示符
  • 3.下载PHP源代码
  • 4.准备扩展源代码
  • 5.配置PHP和扩展构建
  • 6.构建PHP和扩展
  • 谢谢
在基于PHP 5.3的一个非常老的项目上工作之后, 需要APC库才能使其工作, 我知道找到APC扩展使其在Windows平台上工作是多么困难。对于Linux, 使用PECL可以很容易地完成该过程, 但是在Window中这是一个实际的问题。
这就是为什么今天我将向你展示如何在Windows环境中从头开始从源代码编译PHP扩展, 特别是使用APC库和PHP 5.3.8。
要求
  • Visual Studio:该版本需要与Visual C ++的接受版本提供某种兼容性, 有关更多信息, 请参见第一点。
  • PHP源代码:适用于Windows的PHP的源代码, 你需要与该扩展兼容的版本。
  • 扩展源代码:你要编译为动态链接库(DLL文件)的PHP扩展的源代码。
话虽如此, 让我们开始编译!
1.准备Visual Studio环境 在开始编译PHP扩展之前, 你需要了解并非每个VS编译器都与任何版本的PHP兼容, 因此你将需要根据所需的PHP版本知道需要使用哪个Visual Studio。编译你的扩展名(获取DLL文件)。请查看下表, 该表指定了编译所需的PHP版本所需的Visual Studio版本:
  • 是:支持此版本, PHP团队提供使用此编译器构建的二进制文件
  • 否:不支持
PHP版本 5.2.x 5.3.x 5.4.x 5.5.x 5.6.x 7.0.x 7.1.x 7.2.x 64位(***)
Visual C ++ 6(仅SP6) No No No No No No No
Visual C ++ 7 / 7.1(2002、2003、2003 + sp1) 是(**) 是(**) No No No No No No No
Visual C ++ 8(VS 2005) 是(**) No No No No No No No No
Visual C ++ 9(仅限VS 2008 SP1) 是(**) 是(**) No No No No No
Visual C ++ 11(VS 2012) No No 是(**) 是(**) No No
Visual C ++ 14(VS 2015) No No No No No 是(**) 是(**)
Visual C ++ 15(VS 2017) No No No No No 是(**) 是(**)
  • (*)在最终发布之前可能会被删除
  • (**)没有官方支持, 但已知可以使用
  • (***)根据当前的官方支持对此特定编译器提供支持(或已知有效)
【如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)】因此, 为了易于理解, 如果你愿意为PHP 7编译扩展, 则将需要PHP 7的源代码, 该扩展的代码以及至少Visual Studio 2012(假设你要编译它)对于PHP 7.0, 因为如果要在PHP 7.1中使用, 则至少需要Visual Studio 2015。
知道这一点, 如果你确定自己具有正确的版本, 则在编译扩展程序时不会遇到任何麻烦。否则, 你将在构建配置期间遇到奇怪的异常:
Saving configure options to config.nice.batChecking for cl.exe ...< in default path> Detected compiler undefinedC:\php-src\configure.js(1817, 9) Microsoft JScript runtime error: 'length' is null or not an object

注意 在本教程中, 我们将为PHP 5.3.8构建APC扩展, 因此在本例中, 我们需要使用Visual Studio 2008 SP1 for visual c ++ 9。
2.打开Visual Studio命令提示符 为了运行一些与扩展的开发和构建相关的管理命令, 你将需要一个带有Visual Studio上下文的命令提示符。即, 你可以在以下路径中找到VS的开发人员命令提示符:
C:\ ProgramData \ Microsoft \ Windows \开始菜单\程序\ < 你的Visual Studio版本, 例如2008或2017> \ Visual Studio工具
在这里, 你将找到命令提示符的可执行文件, 该可执行文件可以访问构建扩展所需的所有工具, 并以管理员权限执行该扩展:
如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

文章图片
如前所述, 是一个普通的命令提示符, 其中包含我们下一步所需的工具:
如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

文章图片
根据需要在步骤5中打开它。
3.下载PHP源代码 现在你已经拥有了编译PHP及其扩展的必要工具, 你将同样需要PHP的源代码。你可以在此处从PHP的官方发布网页获取所需的PHP版本的源代码。
下载包含代码的tar / zip文件后, 请将其解压缩到具有短路径的目录中, 以防止Windows中路径长度出现任何问题。在本例中, 我们将在c:/ php-src目录中提取PHP 5.3.8的源代码:
如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

文章图片
稍后, 我们将在命令提示符下的此目录中运行命令以构建PHP以及你的代码。值得一提的是ext文件夹将包含你扩展名的代码, 但我们将在下一步中添加它。
4.准备扩展源代码 为了构建你的扩展程序, 你可以构建一个开源扩展程序, 也可以创建自己的扩展程序。在本例中, 我们将构建APC扩展, 即专门用于PHP 5.3.8的版本3.1.6(与PHP源代码的相同版本)。这将确保生成的PHP dll与我们需要的PHP版本兼容。
下载扩展的源代码(或为其编写自己的代码)后, 请将其解压缩到PHP源代码的ext文件夹中。在我们的例子中, 扩展的目录为c:/ php-src / ext / apc, 其中包含扩展的代码(这很重要, 因为扩展将与PHP一起作为动态库进行编译):
如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

文章图片
还要确保扩展源代码的根目录中的config.w32文件在使用EXTENSION函数注册扩展的行中, 第三个参数设置为true, 以便生成DLL(动态模式)。 ):
EXTENSION('apc', apc_sources, true);

因为你可能知道可以将扩展直接与PHP集成, 但是在本教程中, 我们将展示如何生成DLL文件(在本例中为php_apc.dll)。
5.配置PHP和扩展构建 返回Visual Studio开发人员命令提示符, 并切换到PHP源代码的目录:
cd c:/php-src

然后使用– force参数运行buildconf.bat文件:
buildconf --force

这将生成一个新的.bat文件, 即configure.bat, 它将具有你的PHP构建的配置。使用以下命令运行bat并使用– enable- < extension_folder_name> 参数启用扩展。在本例中, 扩展名为APC, 我们将源代码存储在c:/ php-src / ext / apc目录中, 因此扩展名将为APC。运行命令进行配置:
configure --disable-all --enable-cli --enable-apc

重要的提示 如果运行前面的命令, 但由于找不到bison.exe而遇到异常:
  • 将配置选项保存到config.nice.bat
  • 正在检查cl.exe … < 在默认路径下>
  • 检测到编译器MSVC9(Visual C ++ 2008)
  • 检测到的32位编译器
  • 正在检查link.exe … C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ BIN正在检查nmake.exe … < 在默认路径下>
  • 正在检查lib.exe … < 在默认路径下>
  • 正在检查bison.exe … < 未找到>
  • 错误:需要野牛
从此处的Source Forge网站下载Bison的二进制文件。然后将bison.exe和m4.exe粘贴到Visual Studio的bin目录中, 例如C:\ Program Files(x86)\ < 你的Microsoft Visual Studio版本例如9.0> \ VC \ bin。这将使野牛可执行文件可访问该路径, 并且不再需要野牛这个例外。
– disable-all标志将帮助我们防止不需要的扩展的任何其他例外, 仅关注我们需要的APC扩展。就是这样, 你将得到一个冗长的输出, 其中包含一个列表, 其中包含将与PHP及其模式一起构建的所有扩展名, 例如静态(PHP中的内置类)或共享(动态链接库dll):
如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

文章图片
不出所料, 我们对PHP的扩展将按我们的意愿内置到DLL文件中。默认情况下, 这将创建一个” 线程安全” 构建(PHP 5.3.8 TS)。如果你想要一个非线程安全的构建, 只需将– disable-zts标志添加到configure命令。
6.构建PHP和扩展 最后, 运行nmake命令以使用developer命令提示符在PHP源代码目录中使用PHP开始扩展的构建。 NMake是Microsoft提供的make实用程序, 可在Visual Studio中使用。它是用于创建自动构建的便捷工具。
只需运行以下命令:
nmake

这将开始编译, 并且需要一段时间。它将生成详细输出以及警告等:
如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

文章图片
完成后, 根据线程安全配置, 新目录将出现在c:/ php-src目录中, 即Release或Release_TS。在那里, 你会发现一个非常基础的PHP构建, 但最重要的是, 你为什么专门构建PHP, 扩展DLL文件(在我们的示例中为php_apc.dll)的原因:
如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)

文章图片
谢谢 本文是对多个源的重新整理, 在编译开源扩展或你自己的扩展时, 你可能会发现它们也很有用:
  • 在Windows上构建PHP扩展
  • 在Windows上从源代码编译PHP
编码愉快!

    推荐阅读