轉自:https://www.v2ex.com/t/312651前端
在 2016 年作 PHP 開發是一種什麼樣的體驗?(一)git
嘿,我最近接到一個網站開發的項目,不過老實說,我這兩年沒怎麼接觸編程,據說 Web 技術已經發生了一些變化。據說你是這裏對新技術最瞭解的開發工程師?程序員
你算是找對人了。我對今年的技術別提多熟了, VR 、機器學習、守望先鋒……你儘管問吧。我剛去了幾個熱門的技術大會逛了一圈,沒有什麼新技術是我不知道的。github
厲害。是這樣的,我要開發一個網站,用來展現用戶的最新動態。我想我應該經過後端接口獲取數據,而後用一個 table 來展現數據,用戶能夠對數據進行排序。若是服務器上的數據變化了,我還須要更新這個 table 。個人思路是用 jQuery 來作。面試
可別用 jQuery !如今哪還有人用 jQuery 。如今是 2016 年了,你絕對應該用 React 。數據庫
等等,這句話以前已經有一位前端大神和我說過了,我今天主要是想問你後端該怎麼作。編程
哦原來是這樣,你提到了 Smarty ?你後端語言是 PHP 對吧,如今哪還有人用 Smarty 。如今是 2016 年了,你絕對應該用 Twig 。json
Twig ?也是一個模板引擎嗎?後端
是的,可是 Twig 的語法更加優雅,使用更方便,速度也快,並且許多開發框架都支持把 Twig 做爲模板引擎,和框架的整合也作得更好。api
好吧那我用 Twig ,請問在哪裏下載?
你不用本身下載安裝,只須要在你項目的 composer.json 文件中添加一個依賴,而後 Composer 會幫你安裝。
等等, Composer 是什麼?
Composer 是一個以 PSR-4 標準進行自動化包管理的工具,用它能夠方便的進行各類第三方軟件的依賴管理和下載、更新等操做
PSR-4 ?
對, PSR-4 是 PHP-FIG 組織提出的多個爲了統一項目規範的標準之一,是用來規範 PHP 項目的 Namespace 、目錄結構、加載規範的。
那除了 PSR-4 以外還有什麼?
還有用來規定代碼風格的 PSR-1 ,以及 PSR-1 的擴展版本 PSR-2 ,還有用來規定日誌的 PSR-3 ,用來規定緩存的 PSR-6 ,用來規定 HTTP 頭消息的 PSR-7 ,以及……
等等,怎麼沒有 PSR-5 ?
有的,但 PSR-5 還處在草稿階段,沒有正式發佈,因此我沒有講給你聽。
有 PSR-8 嗎?
有的,如今一共是到 PSR-0 到 PSR-17 ,但我沒提到的那些大部分都在草稿階段,因此同上,我沒有講給你聽。
好吧好吧,我用 Composer 行了吧。
等等,在你用以前,我建議先配置一個鏡像,由於 Composer 的服務器在國外,直接使用常常會出現問題,對了若是你的項目比較大的話,可能第一次使用要 FQ 才能使用。
爲何?
由於雖然軟件的版本信息是存在 Composer 的服務器上的,但有大部分軟件的 zip 文件是存放在 github 或者別的什麼地方的。
好吧這些我都搞定了,我想開始寫代碼了,據說 Zend Framework 挺有名的?
如今是 2016 年了,沒人再用 ZF 了。如今比較流行的 PHP 框架有 Symfony 、 Laravel 、 YII 、 Codeigniter 這些,若是你對性能要求比較高或者想開發一些 Socket 相關的功能的話,能夠試試看 Phalcon 、 Yaf 、 Swoole 、 Workerman 、 ReactPHP 這些,對了最近還有個叫 Kraken 的框架在 Github 上比較火,但我尚未試過。
有沒有國內用的比較普遍的框架?
ThinkPHP 剛剛推出了支持 Composer 的 5.0 版本,但我建議你再觀望一下再決定是否用。
我之前據說最新版本是 3 ,怎麼如今是 5 了,請問 ThinkPHP 4 去哪裏了?
這個套路你還不明白嗎?請問你用過 Java 2/3/4 或者 Windows9 嗎?
好吧,確實沒用過,不過我懂你的意思了。我能夠開始寫代碼了吧? Editplus 我早就裝好了
可別用 Editplus !如今哪還有人用 Editplus 。如今是 2016 年了,你絕對應該用 PHPStorm ,很是好用,同類的還有 NetBeans 、 Zend Studio 但如今已經沒什麼人用了,若是你喜歡簡單一些的工具,能夠用 Sublime 、 Atom ,或者像咱們公司的程序員 MM 同樣直接用 VIM 。
程序員 MM ?
是的,對了咱們公司在漕河涇,有興趣能夠投個簡歷給我 hongt@xieche.net ,有機會在面試時和程序員 MM 直接交流。
好吧好吧…隨便問問,反正我有女友。對了請問代碼該怎麼調試呢?我之前用 Editplus 的時候都是在代碼裏寫 var_dump 和 die 的。
如今哪還有人 var_dump() + die()。如今是 2016 年了,你絕對應該用 Ladybug 。
Ladybug?
對,相似 var_dump + die ,可是更加好用,可以把要 dump 對象裏的內容展現的清清楚楚,配合 Xdebug 你甚至能夠在 IDE 裏進行斷點調試、臨時更改變量的值等等
Xdebug?
是的,一個 PHP 的調試工具,安裝以後能夠像調試 Java 、 C 那樣調試 PHP 。
看起來好高級的樣子,但我程序還沒開始寫呢,我聽人說寫代碼第一步是要建數據庫?
沒錯,但如今已是 2016 年了,沒有人直接用客戶端連上數據庫去建表了,你們都在用 ORM 工具管理數據庫。
什麼是 ORM ?
ORM 可讓你像操做類同樣去操做一個數據庫,知名的 ORM 工具備: Doctrine 、 Propel 、 Eloquent 這些。
難道我不能直接寫 SQL 嗎?
能夠固然是能夠的,但如今是 2016 年了,沒人直接寫 SQL 了。並且若是直接寫 SQL 的話,安全性怎麼辦?若是字段作了變動怎麼更新全部現存的 SQL ?代碼的部署回滾怎麼和數據庫綁定?並且用了 ORM 以後你能夠很簡單的就建立出一個表的 CRUD 表單,甚至能夠很簡單的寫幾行代碼就實現對這個表的各類 API 操做。
聽上去很不錯啊,能舉個例子嗎?
好比我最經常使用的 Doctrine ,只要我用 PHP 類去定義一個表的實體結構( Entity ),我就可讓 Doctrine 自動生成這個表的 DDL ,即便個人表結構有變動, Doctrine 也會幫我生成所對應的 update 表結構的 DDL 。 Entity 在每一個字段上均可以進行設置,設置完我就能夠生成一個對這個表進行操做的 CRUD 表單,假設某個字段我設置的是日期類型,這個字段在 HTML 裏就會被自動生成並映射成爲一個包含三個下拉框的組件,而這三個下拉框分別是年月日。
好酷炫,那還有別的用處嗎?
多了去了,每一個網站都有後臺吧,使用了 Doctrine 的話配合一些工具,只要寫幾行代碼就能夠生成基於表的後臺管理界面,實現一個基本可用的網站後臺。但須要注意 Doctrine 通常是以 Service 的方式被用在項目中的,你直接用 Doctrine 並不會很方便。
Service ?
是的,你能夠理解爲一系列的你代碼中可能會用到的第三方應用,他們都經過 Service 的方式被註冊到程序中,你在用到某個功能的時候,只須要對他們進行調用便可,就像調用一個函數那麼簡單。 Service 通常都會支持 IoC 和 DI ,因此對你未來程序的升級也會頗有幫助。
IoC 和 DI ?這不是 JavaEE 裏面常常用到的東西嗎?
沒錯,但 PHP 項目中如今也在大量使用 IoC 和 DI ,好比 Symfony 和 Laravel 中就都有很是強大的一套 Service 系統,實現了 IoC 和 DI 。
好吧不明覺厲,可是個人開發環境尚未呢,是否是先裝一個 XAMPP 嗎?
如今是 2016 年了,沒人還在用 XAMPP 了。你至少得用個 Vagrant 或者 Docker 吧?否則你的代碼準備怎麼部署?開發環境和生成環境怎麼保證統一?難道你準備直接用 FTP 傳源代碼文件嗎?
er ……是的,難道不該該用 FTP 傳代碼嗎?
如今是 2016 年了,沒人還在用 FTP 直接傳代碼了,最差你也得用個 rsync 吧?你可能沒有 Vagrant 或者 Docker ,但至少應該嘗試用一個部署工具並配置一套部署腳本,好比 Deployer 、 Capistrano 、 Ansible 、 Fabric 等等,若是配合 CI ,自動檢查代碼、部署那就更完美了。
CI ?
對, Continuous Integration ,指的是自動化處理分支的合併、運行測試用例、代碼檢查、部署等操做,你能夠用 Jenkins 本身搭一個,也能夠用 Bamboo 或者 CircleCI.com 。爲了及時知道代碼的 CI 結果,你能夠把你的 CI 系統和 Slack 、零信等 IM 工具作整合,這樣的話你就能夠靈活的在團隊裏分享並自動化處理各類信息。
能舉個例子嗎?
好比代碼若是在線上出了錯,系統能夠自動定位到某一次提交,而且發送郵件給改動人。好比服務器負載高了能夠自動水平擴展服務器架構。
水平擴展服務器架構?
水平擴展的意思就是服務器配置不變,可是數量增多,相對應的垂直擴展就是服務器的性能變高,可是數量不變。
那具體是怎麼作到的呢?
首先你的程序架構要支持水平擴展,好比 session 和數據庫不能存放在單機上,固然還有一些複雜的注意事項暫且不提。其次是你的服務器架構要支持水平擴展,若是你用的是雲服務,通常都會有水平擴展的 API ,直接調用就是了。
聽起來好複雜,個人網站暫時應該不會有流量問題,但若是程序出現問題怎麼辦,有什麼辦法能及時通知到我嗎?
如今是 2016 年了。通常的作法是搭建一套 ELK 系統進行日誌的存儲、搜索、展現。
ELK ?
對,就是 Elasticsearch 、 Logstash 和 Kibana 三個軟件的縮寫,由於你們都常常固定用這三個組合,因此縮寫成了 ELK 。固然若是你不想那麼麻煩,能夠用 Sentry ,或者再簡單點本身搭建一個 Log.io
你別扯遠,我就想簡簡單單跑一個 PHP 的運行環境,據說 Facebook 公司曾經出了個叫什麼 HipHop for PHP 的東西?
沒想到你還懂得挺多, HipHop 是 Facebook 出的一款用來加速 PHP 運行的軟件,核心原理是把 PHP 代碼編譯成爲一個能夠直接執行的程序。並且如今已是 2016 年了,沒人再用 HipHop 了。如今至少你得用 HHVM ,或者 PHP7
HHVM ?
是的 HHVM ,由於 HipHop 須要編譯才能用,每次 PHP 代碼改動都須要從新編譯,很是麻煩,因此 Facebook 轉而作了 HHVM 。核心原理差很少,但 HHVM 再也不須要編譯過程,能夠直接執行 PHP 文件了,基本上你能夠理解爲 HHVM 是一個超級加速版的 PHP 。