php内核编译phpsdk的deps下载逻辑,如何快速升级deps?
发布于 作者:苏南大叔 来源:程序如此灵动~在windows
环境下,对php
内核进行编译的时候,需要使用phpsdk
工具。那么,本文中主要说说phpsdk
使用的第一步,升级安装deps
工具,这些deps
的相关因素是:vc
版本,x64/x86
,以及phpsrc
。deps
是用于编译phpsrc
的。默认环境下,这些deps
工具是不存在的。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述:phpsrc
内核编译的依赖工具如何下载,其下载过程的基本逻辑,如何修改这些逻辑走向,如何保留下载回来的安装包,如何识别自行下载的文件。测试环境:win10
,phpsdk@2.2.1
,php@7.4.28
。当然,解决deps
下载慢的问题,最好的解决方案是挂代理。但是,如果理解了运行原理,也会有其它的解决方案。
使用姿势
php-sdk-binary-tools
的下载地址:
本文龙套演员是phpsrc-7.4.28
,下载地址是:
准备deps
目录
在前几篇文章中,大家已经知道了phpsdk
实际上要区分vc
版本和arch
构架。比如苏南大叔要在win10
下编译phpsrc@7.4.28
,先执行phpsdk-vc15-x64.bat
文件,在执行环境中就默认定义了两个变量vc15
和x64
。
phpsdk-vc15-x64.bat
进入新的输入界面后,准备你的phpsrc
位置。比如:使用系统推荐的目录。
phpsdk_buildtree phpdev
上述命令行自动进入phpdev/vc15/x64/
,挺智能的吧?此时一并生成了本文主角:一个空的deps
目录。
苏南大叔个人认为:这个目录布局并不是很合理。因为:不同的phpsrc
实际上是公用同一个deps
,然而它们所需要的deps
目录是不同的。
然后把下载到的phpsrc
文件解压到deps
同级目录。
执行deps
升级
第二次就命令行cd
直接进入phpsrc
所在的目录(可以不放在系统推荐的目录下面的)。
在phpsrc
目录内部,执行本文主要描述的命令:
phpsdk_deps -u
或者
phpsdk_deps --update
该命令就可以自动识别出vc15
和x64
,然后去下载对应的deps
文件。用于存放各种编译用工具。如果网速足够快的话,这个命令很快就可以把需要的文件都下载回来。但是,如果网速很慢呢?这可能就需要了解deps
命令的基本逻辑了。
基本逻辑
在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.
全部解压完之后,会在.tmp
的同级.cache
目录,生成一个带md5值(固定值)的.txt
文件。例如:
php-sdk-binary-tools-master\.cache\15f7afbfee51d6c8124bb14620efc507.packages-7.4-vc15-x64-stable.txt
这个文件名中的md5
部分,实际上来自于要编译的这个phpsrc
同级的deps
目录的实际路径,所以会是个固定值。
会最终将deps
目录从临时目录移动到phpsrc
的同级位置。如果移动之前已经存在deps
目录,那么会对已经存在的deps
目录进行备份重命名保存。
下载什么文件
根据vc15
,x64
,以及版本号的组合,会去下面的位置获取下载列表:
/deps/series/packages-<主版本>.<次版本>-<vc版本>-<arch版本>-stable.txt
根据上述列表文件的列表描述,到下面的目录中去下载文件。
/deps/<vc版本>/<arch版本>/
逻辑修改
为了解决网速问题,苏南大叔在这里对php-sdk
做一些逻辑修改,仅仅是些无聊调试,非必须!
不删除临时文件
每个临时文件在解压后,都会被删除,这里需要保留这些文件,修改源码:lib\php\libsdk\SDK\Build\Dependency\Manager.php
:
{
//...
// $pkg->cleanup();
//...
}
// $this->rm($tmp_dir_packs);
// $this->rm($tmp_dir);
下载到固定位置
这个位置为了使用自己下载好的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);
使用已下载的文件
因为网速的原因,这些要下载的文件,可以自己使用迅雷下载回来。然后放置到上述已经固定的临时packs
目录中,然后修改源码读取:
public function retrieve(string $path) : void
{/*{{{*/
//...
if(!file_exists($this->filepath)){
//...
}
}/*}}}*/
验证完整性
完整性监测逻辑是做md5比对,.cache
目录中的(*)vc15-x64.txt
和线上的vc15-x64.txt
,两者md5
一致即可认为无需更新。文件对比双方:
php-sdk-binary-tools-master/.cache/15f7afbfee51d6c8124bb14620efc507.packages-7.4-vc15-x64-stable.txt
使用本地的zip
包的话,可以很快就生成这个文本文件。
额外发现
如果大家仔细观察的话,上述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
!真心是“先有鸡还是现有蛋”的问题了!
参考文献
- https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2
- https://windows.php.net/downloads/php-sdk/deps/
总结
本文主要描述的就是deps
的生成逻辑,以及魔改的依据。为了解决慢的问题,可以对逻辑魔改之后,实现自定义的文件下载解压逻辑。(当然,这并不是最佳方案,但是很有意思,对不?)
更多php
内核编译的文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。