十二年前救急寫的 174 行 PHP,今天正式棄用
jakeasmith.com(原作者部落格)· 2026-09-17
PHP 套件 http_build_url 今天由原作者 Jake A. Smith 宣布正式棄用,這個 2014 年為了救急寫的 174 行程式,如今在 Packagist 上累積了近 2000 萬次安裝。作者在部落格文章中公布,截至 2026 年 9 月 15 日,總安裝數為 19,864,271,最近 30 天內仍有 401,308 次安裝。
原本的問題
故事要從 AOL 的內容管理系統說起。那套 CMS 大量依賴 pecl_http 擴充套件提供的 http_build_url() 函式,程式碼裡有數十處呼叫點。當 CMS 從 PHP 5.2 升級到 5.3 時,pecl_http 第一版被拿掉,這個函式跟著消失。
照規矩應該把數十處呼叫全部改寫,但作者選擇了更省事的路:重寫一份同名函式當替身,讓既有程式碼不用動。這份重製版只有 174 行,目的很單純——撐住當下的升級,讓 CMS 能繼續跑。作者原本以為這只是暫時墊檔,沒想到那套 AOL CMS 平台後來停運,這個「暫時」方案卻先一步被發佈到 Packagist,脫離原本的專案獨立流傳了下去。
它怎麼變成基礎設施
此後十二年,這個小套件被大量引用進其他專案。作者的文章提到,WPML(WordPress 多語言外掛)直接把它包進去,官方宣稱安裝站台數超過 150 萬;它也被收進 Debian 與 Ubuntu 的套件庫,成為系統層級的相依套件。GitHub 上的原始 repository 累積了 202 顆星、23 個 fork。
2021 年,作者曾在 repository 上公開徵求新維護者,但那之後不久遇上家庭變故,交接不了了之。作者在文章中坦承,自己已經離開 PHP 生態圈將近十年,卻仍掛名維護一個被近 2000 萬次安裝依賴的套件。
為什麼現在要棄用
直接導火線是一個不會修的 bug:GitHub issue #25 記錄了套件在處理路徑拼接時,只要 URL 結尾帶斜線,就會把結果字串裡所有的字母「a」都吃掉。作者在 repository 上明白寫著不會修這個問題。除了這個技術債,作者列出的棄用理由還有:套件的階段性任務早已達成、自己脫離 PHP 圈太久難以負責任地維護、而如果貿然轉交給不熟識的新維護者,反而可能替近 2000 萬個依賴此套件的專案埋下供應鏈風險。
對誰有影響、該做什麼
作者在文章與 GitHub 頁面上都指出,已發佈的版本會留在 Packagist 上,不會被下架,現有安裝不會立即壞掉,但不會再有新版本或修補。真正該注意的是還在用它拼 URL 的專案:作者建議如果專案能升級到即將推出的 PHP 8.5,可以直接改用內建的原生 Uri\Rfc3986\Uri,不用再依賴第三方套件;PHP 8.5 之前的版本,則建議改用社群標準的 The PHP League 的 uri 函式庫,或退回最基本的 parse_url() 加 http_build_query() 組合。
// 舊寫法:依賴 jakeasmith/http_build_url
$url = http_build_url($parts);
// PHP 8.5 起:改用內建的 URI API
$uri = Uri\Rfc3986\Uri::parse($string);
// PHP 8.5 之前,不想加相依:
$parts = parse_url($url);
$query = http_build_query($params);對於暫時不打算搬家的專案,作者也留了退路:GitHub 上由 ozh 維護的 社群 fork 可以接手後續維護與修補。作者特別點名 WPML 與打包進 Debian/Ubuntu 的下游套件,是受影響最直接的兩群使用者,因為它們是把這個函式庫綁進更大量終端安裝的管道。
原始來源:Jake A. Smith:My temporary PHP fix from 2014 has nearly 20M installs、jakeasmith/http_build_url(GitHub)