windows环境下,对php内核进行编译的时候,需要使用phpsdk工具。那么,本文中主要说说phpsdk使用的第一步,升级安装deps工具,这些deps的相关因素是:vc版本,x64/x86,以及phpsrcdeps是用于编译phpsrc的。默认环境下,这些deps工具是不存在的。

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - phpsdk-deps
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述:phpsrc内核编译的依赖工具如何下载,其下载过程的基本逻辑,如何修改这些逻辑走向,如何保留下载回来的安装包,如何识别自行下载的文件。测试环境:win10phpsdk@2.2.1php@7.4.28。当然,解决deps下载慢的问题,最好的解决方案是挂代理。但是,如果理解了运行了原理,也会有其它的解决方案。

使用姿势

php-sdk-binary-tools的下载地址:

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - phpsdk-tools
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-2)

本文龙套演员是phpsrc-7.4.28,下载地址是:

准备deps目录

在前几篇文章中,大家已经知道了phpsdk实际上要区分vc版本和arch构架。比如苏南大叔要在win10下编译phpsrc@7.4.28,先执行phpsdk-vc15-x64.bat文件,在执行环境中就默认定义了两个变量vc15x64

phpsdk-vc15-x64.bat

进入新的输入界面后,准备你的phpsrc位置。比如:使用系统推荐的目录。

phpsdk_buildtree phpdev

上述命令行自动进入phpdev/vc15/x64/,挺智能的吧?此时一并生成了本文主角:一个空的deps目录。

苏南大叔个人认为:这个目录布局并不是很合理。因为:不同的phpsrc实际上是公用同一个deps,然而它们所需要的deps目录是不同的。

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - deps目录结构
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-3)

然后把下载到的phpsrc文件解压到deps同级目录。

执行deps升级

第二次就命令行cd直接进入phpsrc所在的目录(可以不放在系统推荐的目录下面的)。

phpsrc目录内部,执行本文主要描述的命令:

phpsdk_deps -u

或者

phpsdk_deps --update

该命令就可以自动识别出vc15x64,然后去下载对应的deps文件。用于存放各种编译用工具。如果网速足够快的话,这个命令很快就可以把需要的文件都下载回来。但是,如果网速很慢呢?这可能就需要了解deps命令的基本逻辑了。

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 目录结构2
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-4)

基本逻辑

php-sdk-binary-tools-master目录下面的.tmp目录,生成一个随机数(每次不一样)的目录,用于存放下载回来的安装包。该随机目录下面的deps目录,是个临时的deps目录。packs目录,用于存在下载的压缩包,解压后到deps目录。

Get the libraries on which PHP depends:
use the PHP SDK tools to fetch the suitable dependencies automatically by calling phpsdk_deps -u
alternatively, download the packaged deps from http://windows.php.net/downloads/php-sdk/deps/ choosing the matching VC++ version and architecture directory. Note the .7z packages are not provided anymore for PHP 7.2 and up.
Note: This should include the libraries needed to build most the core extensions. However, some other extensions may need additional libraries, header files and helper apps. See libs, fetch the version you need and extract the archive into the deps directory (see below). Another set of libraries used for the PECL extension builds is available under PECL deps directory. If required, they need to be fetched manually.

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 逻辑走向
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-5)

全部解压完之后,会在.tmp的同级.cache目录,生成一个带md5值(固定值)的.txt文件。例如:

php-sdk-binary-tools-master\.cache\15f7afbfee51d6c8124bb14620efc507.packages-7.4-vc15-x64-stable.txt
这个文件名中的md5部分,实际上来自于要编译的这个phpsrc同级的deps目录的实际路径,所以会是个固定值。

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 验证凭证文件
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-6)

会最终将deps目录从临时目录移动到phpsrc的同级位置。如果移动之前已经存在deps目录,那么会对已经存在的deps目录进行备份重命名保存。

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 目录备份
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-7)

下载什么文件

根据vc15x64,以及版本号的组合,会去下面的位置获取下载列表:

/deps/series/packages-<主版本>.<次版本>-<vc版本>-<arch版本>-stable.txt

根据上述列表文件的列表描述,到下面的目录中去下载文件。

/deps/<vc版本>/<arch版本>/

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 下载的文件列表
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-8)

逻辑修改

为了解决网速问题,苏南大叔在这里对php-sdk做一些逻辑修改,仅仅是些无聊调试,非必须!

不删除临时文件

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 修改源码1
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-9)

每个临时文件在解压后,都会被删除,这里需要保留这些文件,修改源码:
lib\php\libsdk\SDK\Build\Dependency\Manager.php:

{
//...
//    $pkg->cleanup();
//...
}
// $this->rm($tmp_dir_packs);
// $this->rm($tmp_dir);

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 修改源码2
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-10)

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 目录结构2
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-11)

下载到固定位置

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 修改源码3
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-12)

这个位置为了使用自己下载好的zip文件,需要固定临时的packs位置,所以这里可以修改:
lib\php\libsdk\SDK\Build\Dependency\Manager.php:

// $tmp_dir = $this->md("", true);
$tmp_dir = $this->md(Config::getTmpDir().DIRECTORY_SEPARATOR . "fix", true);

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 修改源码3效果
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-13)

使用已下载的文件

因为网速的原因,这些要下载的文件,可以自己使用迅雷下载回来。然后放置到上述已经固定的临时packs目录中,然后修改源码读取:

public function retrieve(string $path) : void
{/*{{{*/
    //...
    if(!file_exists($this->filepath)){
        //...
    }
}/*}}}*/

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - file-exists
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-14)

验证完整性

完整性监测逻辑是做md5比对,.cache目录中的(*)vc15-x64.txt和线上的vc15-x64.txt,两者md5一致即可认为无需更新。文件对比双方:

php-sdk-binary-tools-master/.cache/15f7afbfee51d6c8124bb14620efc507.packages-7.4-vc15-x64-stable.txt

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 升级是否可用的标准
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-15)

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - cache命令逻辑
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-16)

使用本地的zip包的话,可以很快就生成这个文本文件。

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - 更新是否可用逻辑
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-17)

额外发现

如果大家仔细观察的话,上述deps的主要逻辑是php的,那么问题来了,我们的目的不就是编译php内核么?没编程成功之前,为啥就执行php了?如何执行的php

根据代码执行的结果,可以发现:这些php文件,是通过下面的文件执行的。

php-sdk-binary-tools-master\bin\php\do_php.bat

文件内容:

@echo ofF

%~dp0php.exe -c %~dp0php.ini -d curl.cainfo=%PHP_SDK_ROOT_PATH%\msys2\usr\ssl\cert.pem -d extension_dir=%~dp0ext %*

这个文件的同级目录,有个php@7.4.4!真心是“先有鸡还是现有蛋”的问题了!

苏南大叔:php内核编译phpsdk的deps下载逻辑,如何快速升级deps? - do_php-bat
php内核编译phpsdk的deps下载逻辑,如何快速升级deps?(图18-18)

参考文献

总结

本文主要描述的就是deps的生成逻辑,以及魔改的依据。为了解决慢的问题,可以对逻辑魔改之后,实现自定义的文件下载解压逻辑。(当然,这并不是最佳方案,但是很有意思,对不?)

更多php内核编译的文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。