← 文章 / 开源项目
Hacker News 3小时前 · 2026-09-17 18:20:24 · 3 阅读

我2014年写的PHP临时补丁装机量近2000万,今天正式弃用

十二年前,我为 AOL 的内容管理系统写了一个临时补丁,也就是174 行 PHP 代码。我把它发布到了 Packagist,想着万一别人也需要同样的补丁呢。结果它至今被安装了近 2000 万次。今天,我把它标记为弃用。

一个临时的垫片

2014 年,我们正把 AOL 的 CMS 从 PHP 5.2 升级到 5.3。这次升级要淘汰 pecl_http 扩展的第 1 版,而它提供了一个叫 http_build_url() 的函数。CMS 要处理大量 URL,我们的代码里有几十处调用这个函数,我不想挨个去改。这个函数看起来不难复现,于是我自己写了一个 http_build_url(),并且只在真正的扩展函数不存在时才定义它。这样旧代码完全察觉不到任何变化。

当时 Composer 正在兴起,分享代码变得很容易。我原以为它能撑个一两年,等 PHP 社区有了更好的方案,它就可以功成身退了。

这个安装量有点惊人

结果,它一点也不“临时”。它从 Packagist 被安装了近 2000 万次,目前每月仍有超过 40 万次安装。

截至2026年9月15日,jakeasmith/http_build_url在Packagist上的安装统计:总安装量19,864,271次,过去30天安装401,308次。每日安装量从2014年的接近零稳步攀升至2026年的每天约13,000次。

而且 Composer 只是冰山一角。WordPress 市占率第一的多语言插件 WPML 直接把这个 polyfill 打包进了自己的代码库,据 WPML 称它被安装在超过 150 万个站点上。域名处理库 idna-convert 也依赖它,因此它随库进入了法国 CMS SPIP 的源码,还被打包进 Debian 和 Ubuntu。算下来,你很可能访问过某个仍在运行我代码的网站。

我从没想过它会走到这一步。

回头再看

直到几个月前,我第一次在多年后查看这个包,才意识到它的影响范围有多广。我当然知道它有人用,但到 2021 年我已经离开 PHP 开发有一段时间了,下载量之高甚至有些出乎意料,于是我呼吁寻找新的维护者。有三个人主动请缨。紧随其后,家里一位成员突然离世,我们的生活天翻地覆了一阵子。我始终没有跟进此事,这是我的失职。等到生活重回正轨,其他目标已经占据了我的精力,我也就此遗忘了这个包好几年。

除了冰冷的下载数字,GitHub 上还有几个 Issue,其中一个尤为离谱:当 URL 末尾带有斜杠时,将路径拼接上去会导致路径中所有的字母“a”都被剥离。这哪里还谈得上“简单直观”?在一条写着 // Workaround for trailing slashes(处理尾部斜杠的变通方法)的注释下,我的代码会在路径末尾拼上一个“a”,确保永远有一个“最后片段”可供切除,然后通过查找替换将其移除。当路径本身以斜杠结尾时,这个“最后片段”恰好就是那个“a”,结果查找替换操作把路径里其他所有的“a”也一并删掉了。我都难以置信这个 Bug 竟然在如此长的时间里无人察觉。

摆在我面前的是一道选择题:是在离开近十年后重新跳进 PHP,把包交给那些主动请缨的人之一,还是让它继续搁置在那里?

以上皆非

它本就被设计为临时方案,如今我要正式将其退役了。PHP League 的 URI 库多年来一直是社区的标准答案,而PHP 8.5 现在也内置了符合标准的 URI API(感谢 jawira 向我推荐)。这两者都远胜于 2014 年那个仅有 174 行的 shim。维护这个旧包只会拖延所有人本应进行的迁移,而移交维护权更会引入额外的风险。我并不怀疑那些愿意接手的人,ozh 甚至一直在为 YOURLS 维护一个 Fork。但一个被大量安装且由下游用户从未审核过的新维护者维护的包,正是攻击者眼中的香饽饽。Veritasium 关于 xz Utils 后门事件的纪录片是我看过的关于此类风险如何爆发的最佳解读。

该包仍可正常安装,但不会再提供新修复,包括针对缺失 "a" 字符的 Bug。在如此长时间未更新的情况下,哪怕是一行代码的修改都可能对某些用户产生意外影响,且已无人提供支持。README 中说明了如何切换。

我写这段代码是为了缓解一次痛苦的重构过程,供我自己和面临同样处境的其他人使用。感谢每一位提交 Pull Request 或主动提出接手的人,也感谢那些在我停止关注后仍不断提交 Issue 的用户。对于这个临时修复方案来说,这段经历已经相当圆满。

附注:我们从未将 AOL 的 CMS 从“临时”兼容库中迁移出去。它一直运行到该平台在 2020 年左右整体关闭。

原始来源: Hacker News

评论 (0)