本文概述
- 要求
- 1.准备Visual Studio环境
- 2.打开Visual Studio命令提示符
- 3.下载PHP源代码
- 4.准备扩展源代码
- 5.配置PHP和扩展构建
- 6.构建PHP和扩展
- 谢谢
这就是为什么今天我将向你展示如何在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 | 是(**) | 是(**) | 是 | 是 |
- (*)在最终发布之前可能会被删除
- (**)没有官方支持, 但已知可以使用
- (***)根据当前的官方支持对此特定编译器提供支持(或已知有效)
知道这一点, 如果你确定自己具有正确的版本, 则在编译扩展程序时不会遇到任何麻烦。否则, 你将在构建配置期间遇到奇怪的异常:
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工具
在这里, 你将找到命令提示符的可执行文件, 该可执行文件可以访问构建扩展所需的所有工具, 并以管理员权限执行该扩展:
文章图片
如前所述, 是一个普通的命令提示符, 其中包含我们下一步所需的工具:
文章图片
根据需要在步骤5中打开它。
3.下载PHP源代码 现在你已经拥有了编译PHP及其扩展的必要工具, 你将同样需要PHP的源代码。你可以在此处从PHP的官方发布网页获取所需的PHP版本的源代码。
下载包含代码的tar / zip文件后, 请将其解压缩到具有短路径的目录中, 以防止Windows中路径长度出现任何问题。在本例中, 我们将在c:/ php-src目录中提取PHP 5.3.8的源代码:
文章图片
稍后, 我们将在命令提示符下的此目录中运行命令以构建PHP以及你的代码。值得一提的是ext文件夹将包含你扩展名的代码, 但我们将在下一步中添加它。
4.准备扩展源代码 为了构建你的扩展程序, 你可以构建一个开源扩展程序, 也可以创建自己的扩展程序。在本例中, 我们将构建APC扩展, 即专门用于PHP 5.3.8的版本3.1.6(与PHP源代码的相同版本)。这将确保生成的PHP dll与我们需要的PHP版本兼容。
下载扩展的源代码(或为其编写自己的代码)后, 请将其解压缩到PHP源代码的ext文件夹中。在我们的例子中, 扩展的目录为c:/ php-src / ext / apc, 其中包含扩展的代码(这很重要, 因为扩展将与PHP一起作为动态库进行编译):
文章图片
还要确保扩展源代码的根目录中的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 … < 未找到>
- 错误:需要野牛
– disable-all标志将帮助我们防止不需要的扩展的任何其他例外, 仅关注我们需要的APC扩展。就是这样, 你将得到一个冗长的输出, 其中包含一个列表, 其中包含将与PHP及其模式一起构建的所有扩展名, 例如静态(PHP中的内置类)或共享(动态链接库dll):
文章图片
不出所料, 我们对PHP的扩展将按我们的意愿内置到DLL文件中。默认情况下, 这将创建一个” 线程安全” 构建(PHP 5.3.8 TS)。如果你想要一个非线程安全的构建, 只需将– disable-zts标志添加到configure命令。
6.构建PHP和扩展 最后, 运行nmake命令以使用developer命令提示符在PHP源代码目录中使用PHP开始扩展的构建。 NMake是Microsoft提供的make实用程序, 可在Visual Studio中使用。它是用于创建自动构建的便捷工具。
只需运行以下命令:
nmake
这将开始编译, 并且需要一段时间。它将生成详细输出以及警告等:
文章图片
完成后, 根据线程安全配置, 新目录将出现在c:/ php-src目录中, 即Release或Release_TS。在那里, 你会发现一个非常基础的PHP构建, 但最重要的是, 你为什么专门构建PHP, 扩展DLL文件(在我们的示例中为php_apc.dll)的原因:
文章图片
谢谢 本文是对多个源的重新整理, 在编译开源扩展或你自己的扩展时, 你可能会发现它们也很有用:
- 在Windows上构建PHP扩展
- 在Windows上从源代码编译PHP
推荐阅读
- 如何在Doctrine和Symfony 3中启用加密哈希函数(MD5,SHA1和SHA2)
- 如何解决Composer安装/更新错误(VirtualAlloc()失败:[0x00000008])
- 对于Xamarin Android,我无法处理点击事件的后台通知
- Android Oreo中的通知被延迟
- 有没有办法从桌面/服务器盒发送WhatsApp消息()
- Android Studio(带有ARGB的通知LED上的自定义颜色不起作用)
- Xamarin Android - 自定义通知托盘图标(状态栏)
- 所有移动设备制造商的启动器图标上的Android徽章编号
- android firebase通知不起作用