Tumblr:我們是如何從 PHP 5 升級到 PHP 7 的
Tumblr 團隊經常在尋找新的方式來提升網站的性能。這意味著要給訪問量大的代碼增加緩存,找到更快的 CDN 配置,或者升級基礎軟體。
最近,通過一次跨團隊的努力,我們將全部 web 伺服器戰艦從 PHP 5 升級到了 PHP 7。整個升級是一次有趣的項目,有一些非常酷的結果,所以我們想分享給你。
時間表
這起源於 2015 年秋的一個黑客日(hackday,類似於黑客馬拉松)項目。@oli 和 @trav 在 PHP7 RC
上運行 Tumblr
. 此時, 很多 PHP
擴展還不支持 PHP 7
, 但是有一些非官方的 forks
已經在(非常)試驗性的支持了,就算是這樣,它還是跑起來了。
這個春天,PHP7
開始變得更加穩定了,我們決定是時候開始密切關注升級了,我們做的第一件事就是打包新版本,這樣安裝就變得簡單並且一致。同時,我們也把我們內部的 PHP
擴展放進了新版本里,這樣所有東西都準備好了,隨時可用。
我們編寫了一個小腳本來升級(或者降級)開發伺服器,然後,春末夏初,開始了測試(更多內容請往下看),PHP
包的構建迭代,性能測試和評估,隨著它的穩定,我們開始吸引更多的開發者在支持 PHP7
的機器上進行他們的日常開發。
最後,在 8 月底,我們對我們的測試充滿自信, 於是我們在生產伺服器上的一小部分使用了 PHP7
。兩周後,隨著逐步增加,所有響應用戶請求的伺服器都更新了!
測試
當我們進行升級時,測試所有代碼並確保它們以相同的方式運行是非常重要的,我們有一些方法來解決這個問題。
Phan. 在這個項目中,我們用它在代碼庫中查找與 PHP7
不兼容的代碼,有了它,找到並且解決這些問題變得非常容易。
我們還有一些單元和集成測試來幫忙確定哪些方面不能像以前一樣有效的工作,由於這個項目還在正常開發,我們需要確保沒有添加任何沒有通過 PHP7
驗證的代碼。所以我們用 CI
任務來跑所有的 PHP 5
和 PHP7
的測試
結果
那麼在項目結束時,最後的結果是什麼?好吧,有兩件事對我們有很大的改進,一個是性能另一個是語言的特徵。
性能
當我們把 PHP7 推到首批伺服器上時,很明顯我們更關注的是各種圖表,以確保事情能夠順利的進行。正如我們上面提到的,我們正在尋找性能的改進,但是實際結果是驚人的。幾乎第一時間發現了延遲下降了一半,伺服器上的 CPU 負載至少減少了50%還要多。我們的伺服器服務速度比原來的快兩倍,而且是只用了一半的 CPU 資源來完成的。
以上這些是處理 API 服務的部分圖表。正如你所看到的,延遲下降到不到一半,平均峰值負荷現在低於以前的最低點!
語言功能
PHP 7 還帶來了許多有趣的新功能,可以讓 Tumblr 的開發人員的生活變得更輕鬆。 一些亮點是:
- 標量類型提示:PHP 在歷史上對於類型安全來說相當差,PHP 7 引入了標量類型提示,它確保傳遞的值符合特定類型(string,bool,int,float 等)。
- 返回類型聲明:現在,使用 PHP 7,函數可以具有語言將執行的顯式返回類型。 這減少了對一些樣板代碼的需求並手動檢查函數的返回值。
- 匿名類:非常類似於匿名函數(閉包),匿名類在運行時構建,可以模擬類,符合介面,甚至可以擴展其他類。 這些對於記錄類等實用對象很有用,並且在單元測試中很有用。
- 各種安全和性能增強。
總結
PHP 7 真牛逼!
更多現代化 PHP 知識,請前往 Laravel / PHP 知識社區
推薦閱讀: