熟悉個人朋友應當知道,近些年的大部分時間個人工做都會多少和 PHP 相關。隨着 PHP 有着愈來愈深刻的瞭解,以及遇到愈來愈多的不一樣業務時,使用 PHP 總會讓我有一種莫名的無力感。固然,並非我一我的在使用 PHP 的時候遇到了問題。事實上,每一個略微有一些經驗,接觸過一些需求的人都會有一樣的困惑。各類配合 LAMP(或者LNMP?)架構的後端技術也所以被髮明或被發現,進而整合到 PHP 的開發的技術體系中。從簡單的Memcached做爲數據中轉,cron 後端定時處理;到 Gearman、RabbitMQ 這些隊列神器;最近 @Laruence 甚至封裝了利用 libcurl 的異步特性實現併發 RPC 調用的 yar 擴展。幾乎整個社區都在尋找 PHP 的摩西之路。 php
好吧,說了一大堆,迴歸主題。以前我寫了一篇英文練筆《Why you PHP guys should learn Golang》,得到很多國際友人的關注。排除拼寫和語法被他們詬病外,主要是有許多朋友以爲我沒把事情說清楚。因此這裏我用母語從新聊聊這個事情,只是這些國際友人何時能學會閱讀中文呢?;) html
Go 或者 Golang,是由 Google 支持的快速、一致、穩定的,有活躍的社區支持的開源編程語言。愈來愈多的應用選擇使用 Golang 進行構建。雖然 Rob Pike 說「… 咱們但願 C++ 程序員來了解 Go 並做爲一個可選的語言 …」,不過我真得認爲:PHPer 應當學習 Golang! 接下來咱們就來談談緣由。 python
PHP 至關容易學習。Golang 也是! git
在這點上,一羣大老外對個人觀點進行了猛烈的抨擊。他們認爲我羞辱了 PHPer,說得好像只有簡單的東西 PHPer 才能學會同樣。可是,這難道不是事實嗎?或者換個說法:像我同樣的喜歡 PHP 的人,或多或少都會更喜歡簡單的東西。 程序員
PHP 的語法接近 C 族編程語言(C/C++/Java等等)。若是有這些語言的經驗,在第一次遇到 PHP 的時候馬上就能開始上手編寫代碼。在我看來,編寫 PHP 代碼或許更加考驗程序員的記憶力,而不是智力(當你面對各類不一樣風格的函數定義、各類擴展的特殊約定時,你必定會至關認同個人觀點)。 github
Golang 一樣是一個 C 族編程語言。呃,或者有一些不一樣吧。例如關鍵字 「for」,功能上和 PHP 的接近,可是沒有括號。條件語句 「if」 一樣無需括號。能夠閱讀 Effective Go 瞭解更多內容。 golang
Golang 只有 3025 個關鍵字和 47 個操做符號、分隔符號或其餘特殊標記。記住這些標記確實不須要什麼特別的努力。精巧的類型系統至關容易使用。實用的,具備方法的結構體類型代替了笨重的對象系統。接口的設計是 Golang 中我最喜歡的部分。當完成了《Go 指南》的學習以後,利用 PHP 積累的經驗,馬上就能夠開始使用 Golang 處理一些簡單的任務。 chrome
PHP 腳本是由 SAPI 組件進行解析執行的,如 Web 服務器模塊、PHP-FPM 或者 CLI。部署 PHP 所須要的所有東西就是一個 SAPI 環境。配置這個環境對於新手來講多是學習 PHP 過程當中最爲困難的部分。 編程
全部的 Golang 代碼會編譯和連接爲本地碼。因此除了編譯環境,執行時無需再爲其進行任何特別的部署。對比 PHP 環境的配置,這要簡單不少。你真得認爲配置 PHP 環境很複雜嗎?我不以爲,真的!而配置 Golang 編譯環境比那還要簡單點。 後端
我確信已經有大量的 Golang 相關的書籍、文章介紹過如何進行編譯環境的配置了。爲了更加清晰,我這裏梳理一下思路。
有三個步驟須要處理:
或者一步到位:使用二進制包進行安裝。
而後就會獲得一個叫作「go」的工具集合。使用「go」工具和使用 PHP 的 CLI 工具同樣簡單。《[翻譯]go 工具》對此進行了詳細的解釋。
若是一個編程語言容易學習和使用,咱們是否是就應當學習它呢?有許多容易學習和使用的編程語言。難道要把它們都學一遍?答案是顯然的:NO!
可是爲何 PHPer 應當學習 Golang 呢?只是由於它很酷!是的,我在開玩笑,可是這是真的。不管如何先從 PHP 自身談起吧。
PHP 「本來是爲了開發動態的 Web 頁面而設計的服務器端通用語言(Wikipedia)」。PHP 一個重要的特性就是能夠嵌入到 HMTL 中。代碼編寫在「<?php … ?>」標籤內;HTML 寫在標籤外。它有一個強大的擴展系統。擴展使用 C 調用 Zend API 編寫。數據的處理實際上要利用這些擴展完成。在我看來,PHP 是世界上最好的模板語言。
可是當積累了一些 PHP 的經驗,而且開始面對一些更加複雜的 Web 應用時,你必定會對 PHP 產生一種無力的感受。它沒有內建的並行機制,沒有線程、進程(你真得認爲那個簡陋的進程控制能夠不加改造的用在高併發的生產環境?),或者其餘某「程」。一個慢數據源能夠阻塞整個頁面的處理。消息隊列、緩存、代理……系統開始不只僅是 PHP 這麼單純,還包括了許多服務和系統組件。這時,PHP 只處理不多的業務邏輯,成爲真正的模板語言了。
PHPer 們老是在尋找解決這一問題的辦法,如「PHP multithread」或者PHP RPC 併發框架。我很難說哪一種會更好一些。不過我確定你會須要選擇一些編程語言用於後端工做的開發。就我本身的經驗,我嘗試過 C(一直在和 malloc/free 進行搏鬥)/Java(陷入到了 jar 地獄中)/Python(歷來沒能作到 Pythonic 不說,還老是在錯誤的類型中打轉)……若是想要得到性能,就得同內存管理進行搏鬥;若是用 GC,就得部署和調優 VM;當得到便利性的時候,同時也是走在刀尖上,一個小錯誤就引發巨大的災難……每一個都有優點,一樣每一個都有問題。
好吧!如今回到 Golang!
Golang 有 GC,無需關心內存管理(或者能夠用較少的精力去關注它)。代碼被編譯爲本地碼,所以「cp」和「mv」就是部署 Golang 編寫的應用所須要的所有工具。噢,我剛纔已經說過了,Golang 是一個具備靜態類型系統的編譯語言。因此你沒有機會弄亂變量的類型。固然,PHPer 應該學習 Golang 的一個重要緣由是「轉到 Go 是由於他們並未放棄太多的表達能力,可是得到了性能,而且與併發共舞(Rob Pike)」。《Why Not Go?(英文)》對此進行了深刻的分析。
我能夠分享一些個人經驗:有一個 Gearman 的 worker 用於處理後端數據。PHP 經過其 API 鏈接到 Gearman 的 Job Server 向 worker 發起請求。最初 worker 是使用 python編寫的(還有更加原始的版本,PHP 的,可是你能想像它工做起來……唉,不說了……)。這個版本有許多的問題(是咱們本身的問題,不關 Python 的事),可是至少它能工做。後來用 Golang 重寫了這個 worker。爲此我開發了 Golang 的 Gearman API,並使用 Zend API 編寫了一個在 Golang 中執行 PHP 腳本的包。而後將它們放在一塊兒:一個能夠執行 PHP 的 Gearman worker。它已經工做了一段時間了,看起來還不錯!哦,受到 Yar 的啓發,這裏還有一個 Golang 編寫的 RPC 合併器,用來合併 PHP 腳本中的 RPC 調用。如今仍是個玩具,不過或許往後能用得着。這實際上是將 Golang 的 channel 看成消息隊列來用。我在《Golang:有趣的 channel 應用》中對此有一些說明。
世界真美好啊。謝謝 Golang!
不管如何,大多數 PHPer 在進行後端開發的時候都會須要學習一些其餘語言。若是你正在尋找,或者已經嘗試了一些其餘語言。爲何不來試試 Golang?它真得可讓你的生活更加輕鬆和快樂。讓你能夠有更多的時間陪伴你的家人和朋友,吃你愛吃的東西,去你想去的地方。
貌似我仍是沒說清楚啊?好吧,不要緊,在下個月的中國軟件開發者大會上再跟你們就這個話題作一個探討吧。