[笔记][翻译] 在Windows上编译PHP拓展

  • 来自于 Benoit Blanchon 20 January 2015
  • 译者 7gugu
  • 原文章链接 https://blog.benoitblanchon.fr/build-php-extension-on-windows/

我最近尝试编写了一个PHP拓展,虽然说文档上有很详细的介绍如何在Linux上进行编译操作,但是关于在Windows平台上编译的信息少之又少。

所以这篇文章就是给大家介绍一下,如何使用Visual Studio构建一个PHP拓展。

环境要求

这篇指南是假设在你已经编写了链接所示的一个输出”Hello World”的PHP拓展。 here并且你已经在Linux上成功编译了。

在Windows上构建你的PHP拓展前,你需要完成以下的操作。

  1. Visual Studio
    (这里是一个坑点,请确认你的VS的编译器的版本跟PHP编译时的版本是一样的。比如说官网的7.1.33是用的VC14【VS2015】编译的,那么你的拓展也要是用VC14编译的,否则是不能安装你编译好的拓展的。如果你用的是VS2017+,但你有用的是旧版本的PHP环境写的拓展,那么你就要手动编译PHP才能使用你编写的拓展了)
  2. PHP源代码 (未编译的PHP代码)

在之后的文章中,我将会按一下列表假设:

  1. PHP源码是位于C:\php-src
  2. 你编写的”Hello World”拓展位于C:\MyPhpExtensions\hello

在Windows上编译拓展跟Linux上有点相似

你应该已经很熟悉这个过程,但这里还是列出了一个步骤清单给你:
(以下虽然是在Linux上构建编译时运行的代码,但是在Windows上其实是一样的,只是有一些指令的名字和运行方法有点不同而已)

  1. 安装 php-devel
  2. 运行 phpizeconfig.m4中生成configure 脚本 .
  3. 运行 ./configure --enable-hello 生成 Makefile
  4. 运行 make 开始编译拓展

(以下是在Windows上编译时要改变的东西,按步骤执行就可以顺利生成拓展了)

使用 config.w32 替代 config.m4

在Windows平台上, 使用config.w32代替config.m4,但是格式上还是有点不同。

config.m4 迁移到 config.w32 是非常直接的, 你仅仅需要的是把Automake的代码转换成JavaScript语法的代码。

下面是一个简单的例子:

ARG_ENABLE("hello", "Hello World support", "no");
if (PHP_HELLO != "no") {
    EXTENSION("hello", "php_hello.c", true);
}

不要忘记把EXTENSION的第三参数设置成true , 这么设定就会选择生成动态编译库(DLL)而不是静态编译到PHP代码中。

如果你想知道更多关于*.32的语法信息,你可以看看别的文件夹的*.w32文件。

使用 buildconf.bat 代替 phpize

在Windows平台上,你将会使用 buildconf.bat 代替 phpize

打开VS的”适用于 VS 20XX 的 x86/64 本机工具命令提示”命令行工具并且运行以下代码

cd C:\php-src
buildconf.bat --add-modules-dir=C:\MyPhpExtensions

buildconf.bat 将会自动扫描 C:\MyPhpExtensions 文件夹下所有的 config.w32 文件。

随后将会生成一个 configure.bat的脚本文件.

使用 configure.bat 代替 ./configure

在Linux上,configure就仅仅是用来编译拓展用的,但是在Windows平台上configure.bat是用来编译PHP代码为exe文件的。

你需要在运行 configure.bat 时添加以下命令行选项以生成最少数量的内容,从而确保不必解决对外部库的依赖性

cd C:\php-src
configure.bat --disable-all --enable-cli --enable-hello

--disable-all 就是禁止生成其他内容,省略了输入 --disable-xxx--without-xxx的必要 , --enable-cli 是启用php命令行界面 (ie php.exe) , --enable-hello 是启用编译你的拓展”Hello”

系统默认会按照TS(线程安全)模式进行编译,如果你需要NTS(线程非安全)模式进行编译,你仅仅需要加上这一条 --disable-zts ,就可以按照NTS模式进行编译。

使用 NMake 代替 Make

configure.bat 将会生成一个Windows版本的 Makefile 用作在Windows上 Make.(编译代码)

开始编译代码,仅仅需要运行以下代码即可:

nmake

这不仅仅会编译你自己的拓展,同时也会将 php.exe 编译出来。 这对于开发者来说,是一个很方便的做法,因为你需要一个相同编译环境生成出来的 php.exe,那样子才能正确安装你的PHP拓展。

实际上,为了加载到php中,您的扩展必须与php构建相匹配,条件是:

  1. 系统位数 (32 or 64 位)
  2. 线程是否安全 (TS 模式 或者 NTS 模式)
  3. 编译器的版本 (VS9, VS11 之类的.)

如果你确实不需要编译出 php.exe, 那么你仅仅需要按以下代码运行即可:

nmake php_hello.dll

消除警告(Warnings)

在编译PHP拓展的过程中,编译器常常会报一堆警告:

如果你想禁用这些警告,你可以在 c:\php-src\win32\build\config.w32中,加入以下的代码段:

ADD_FLAG('CFLAGS', ' /wd4005 /wd4267 /wd4244 ');
ADD_FLAG('CFLAGS_BD_ZEND', ' /wd4018 /wd4101 /wd4090 /wd4273 ');
ADD_FLAG('CFLAGS_BD_MAIN', ' /wd4018 /wd4090 ');
ADD_FLAG('CFLAGS_BD_MAIN_STREAMS', ' /wd4013 ');
DEFINE('RC', '$(RC) /nologo /d _USING_V110_SDK71_');

并且,在 C:\php-src\ext\standard\config.w32中加入这行代码:

ADD_FLAG('CFLAGS_BD_EXT_STANDARD', ' /wd4047 /wd4018 ');

最后在 C:\php-src\sapi\cli\config.w32中加入下列这一行代码:

ADD_FLAG('CFLAGS_BD_SAPI_CLI', ' /wd4018 ');

笔记: 一些能够帮助你开发PHP拓展的博文[英文生肉]

[笔记][Laravel] .ENV文件应用设定-中文注释

APP_NAME=Laravel

|————————————————————————–
| Application Name-应用名称
|————————————————————————–
|
| 这个值是用来命名你的应用的. 这个值可以被框架用作警告时(?)被调用
| 同时这个这个值可以被应用或包应用
|

APP_ENV=local

|————————————————————————–
| Application Environment-应用环境
|————————————————————————–
|
| 这个Envirment用于定义你的引用在何处运行
| 这可能决定你会如何去配置多个应用程序的配置
| 在’.ENV’中可以设定该值
|

APP_KEY=base64:123213453dshkjch

|————————————————————————–
| Encryption Key-加密秘钥
|————————————————————————–
|
| 该秘钥将用于Laravel的加密函数并且该秘钥应是随机且有32位长
| 若不满足上述条件的话,使用加密函数加密的字符串将是不安全的
| 请在部署前先使用Artisan命令生成一个秘钥
|

APP_DEBUG=true

|————————————————————————–
| Application Debug Mode-应用程序调试模式
|————————————————————————–
|
| 当你开启该模式后,每当出现错误时,将会显示详细的错误提示(还有堆栈崩溃的位置)
| 提示(还有堆栈崩溃的位置).若您选择关闭该功能,系统将会使用一个简单的通用页来
| 代替.使用True来开启,使用False来关闭.
|

APP_LOG_LEVEL=debug

|————————————————————————–
| Logging Configuration-日志配置
|————————————————————————–
|
| 在这里你将就可以为你的应用配置日志记录服务,为此Laravel使用了Monolog PHP日志库.
| 使用该日志库将为您提供多样化的日志记录选项,并且你将可以使用强大的日志处理程序,
| 以及强大的日志格式化程序
|
| 可选的选项: “single”, “daily”, “syslog”, “errorlog”
|

APP_URL=http://localhost

|————————————————————————–
| Application URL-应用程序URL
|————————————————————————–
|
| 该URL是被用于在Artisan控制台模式中生成正确的网页链接的
| 在执行Artisan任务前,你应该设定该链接为你的应用程序的根目录地址
|

[翻译]使用steam APP获取你的steam ‘shared_secret_key’

Note 1: 如果你使用的是邮箱验证,那么你就可以不用看了.

Note 2: 一旦你更换验证设备,那么原有的serect_key就将会失效.


从安卓设备上获取你的秘钥
当你在安卓设备上安装了Steam的APP后,你将可以在该应用中生成你的二步验证密码.对于我们而言,我们仅需要做的仅仅是从中获取shared_serect_key.
目前你都只能使用已经root的手机获取到该数据. (万恶的V社最近修复了不用ROOT的办法):
如果你的手机已经被root,你将可以使用文件管理浏览到该文件,找到后并使用记事本打开编辑.
文件路径是:
/data/data/com.valvesoftware.android.steam.community/f/Steamguard-STEAMID64
如果你的手机未被ROOT,你将无法访问到这部分的数据,即使你安装了根目录文件管理器
在该文件中,你将找到如下的一个变量,其####的部分就是你所需的秘钥
"shared_secret":"#############################"


从IOS设备中获取你的秘钥
当你在IOS设备上安装了Steam的APP后,你将同样可以在该应用中生成你的二步验证密码.对于我们而言,我们仅需要做的仅仅是从中获取shared_serect_key.
由于IOS的特殊机制,为了访问APP的数据,我们需要使用itunes为你的手机在电脑上创建一个备份.
,备份完成后,为了访问你的手机备份,我们还需要安装一个叫iExplorer的软件,该软件类似IToos,但比iToos要强悍
地址:https://www.macroplant.com/iexplorer/download-ie3-pc
安装并运行iExplorer.点击使用demo模式(一般无需入正),点选浏览备份
在软件的右上方,有搜索栏,可以搜索”steam”加快工作进度.
目标文件夹的名字:
AppDomain-com.valvesoftware.Steam
找到后并打开:
\Documents\Steamguard-STEAMID64
这个就是你所需要的文件夹的名字. 此时点击右侧的按钮 “Export to Folder”导出该文件夹.
导出文件夹后,访问其中的文件,你将能够找到如下的字符串,其中的#####就是你所需的秘钥
"shared_secret":"#############################"


使用”Steam Desktop Authenticator”获取你的秘钥

桌面版二步算码机:https://github.com/Jessecar96/SteamDesktopAuthenticator

为了获取shared_secret, 你需要打开SteamDesktopAuth同目录中名字为 ‘maFiles’的文件夹

然后打开名字以你的STEAM64位ID命名的文件

在该文件中,你将找到该字符串,其中的#####就是你所需的秘钥

"shared_secret":"#############################",

如果此处出现乱码怎么办?

你需要再次打开SDA-setup Encryption

出现输入框的时候,输入你的密码,然后一路回车,就可以把那个mafile解密了。

就不会出现乱码的情况了。