Tumblr:咱們是如何從 PHP 5 升級到 PHP 7 的

clipboard.png

Tumblr 團隊常常在尋找新的方式來提高網站的性能。這意味着要給訪問量大的代碼增長緩存,找到更快的 CDN 配置,或者升級基礎軟件。php

最近,經過一次跨團隊的努力,咱們將所有 web 服務器戰艦從 PHP 5 升級到了 PHP 7。整個升級是一次有趣的項目,有一些很是酷的結果,因此咱們想分享給你。laravel

時間表

這起源於 2015 年秋的一個黑客日(hackday,相似於黑客馬拉松)項目。@oli 和 @trav 在 PHP7 RC 上運行 Tumblr . 此時, 不少 PHP 擴展還不支持 PHP 7, 可是有一些非官方的 forks 已經在(很是)試驗性的支持了,就算是這樣,它仍是跑起來了。git

這個春天,PHP7 開始變得更加穩定了,咱們決定是時候開始密切關注升級了,咱們作的第一件事就是打包新版本,這樣安裝就變得簡單而且一致。同時,咱們也把咱們內部的 PHP 擴展放進了新版本里,這樣全部東西都準備好了,隨時可用。github

咱們編寫了一個小腳原本升級(或者降級)開發服務器,而後,春末夏初,開始了測試(更多內容請往下看), PHP 包的構建迭代,性能測試和評估,隨着它的穩定,咱們開始吸引更多的開發者在支持 PHP7 的機器上進行他們的平常開發。web

最後,在 8 月底,咱們對咱們的測試充滿自信, 因而咱們在生產服務器上的一小部分使用了 PHP7 。兩週後,隨着逐步增長,全部響應用戶請求的服務器都更新了!緩存

測試

當咱們進行升級時,測試全部代碼並確保它們以相同的方式運行是很是重要的,咱們有一些方法來解決這個問題。安全

Phan. 在這個項目中,咱們用它在代碼庫中查找與 PHP7 不兼容的代碼,有了它,找到而且解決這些問題變得很是容易。服務器

咱們還有一些單元和集成測試來幫忙肯定哪些方面不能像之前同樣有效的工做,因爲這個項目還在正常開發,咱們須要確保沒有添加任何沒有經過 PHP7 驗證的代碼。因此咱們用 CI 任務來跑全部的 PHP 5PHP7 的測試閉包

結果

那麼在項目結束時,最後的結果是什麼?好吧,有兩件事對咱們有很大的改進,一個是性能另外一個是語言的特徵。函數

性能

當咱們把 PHP7 推到首批服務器上時,很明顯咱們更關注的是各類圖表,以確保事情可以順利的進行。正如咱們上面提到的,咱們正在尋找性能的改進,可是實際結果是驚人的。幾乎第一時間發現了延遲降低了一半,服務器上的 CPU 負載至少減小了50%還要多。咱們的服務器服務速度比原來的快兩倍,並且是隻用了一半的 CPU 資源來完成的。

clipboard.png

clipboard.png

以上這些是處理 API 服務的部分圖表。正如你所看到的,延遲降低到不到一半,平均峯值負荷如今低於之前的最低點!

語言功能

PHP 7 還帶來了許多有趣的新功能,可讓 Tumblr 的開發人員的生活變得更輕鬆。 一些亮點是:

  • 標量類型提示:PHP 在歷史上對於類型安全來講至關差,PHP 7 引入了標量類型提示,它確保傳遞的值符合特定類型(string,bool,int,float 等)。
  • 返回類型聲明:如今,使用 PHP 7,函數能夠具備語言將執行的顯式返回類型。 這減小了對一些樣板代碼的需求並手動檢查函數的返回值。
  • 匿名類:很是相似於匿名函數(閉包),匿名類在運行時構建,能夠模擬類,符合接口,甚至能夠擴展其餘類。 這些對於記錄類等實用對象頗有用,而且在單元測試中頗有用。
  • 各類安全和性能加強。

總結

PHP 7 真牛逼!

更多現代化 PHP 知識,請前往 Laravel / PHP 知識社區
相關文章
相關標籤/搜索