你們是要重構(gòu)php項目吧, 慕課有一門go重構(gòu)php的課程, 帶著阿里 系 的 開發(fā)思維和技術(shù)實現(xiàn), 電子書挺好,
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的開平網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
隨著 PHP 有著越來越深入的了解,以及遇到越來越多的不同業(yè)務(wù)時,使用 PHP 總會讓我有一種莫名的無力感。當(dāng)然,并不是我一個人在使用 PHP 的時候遇到了問題。事實上,每個略微有一些經(jīng)驗,接觸過一些需求的人都會有同樣的困惑。各種配合 LAMP(或者LNMP?)架構(gòu)的后端技術(shù)也因此被發(fā)明或被發(fā)現(xiàn),進(jìn)而整合到 PHP 的開發(fā)的技術(shù)體系中。從簡單的 Memcached作為數(shù)據(jù)中轉(zhuǎn),cron 后端定時處理;到 Gearman、RabbitMQ 這些隊列神器;最近 Laruence 甚至封裝了利用 libcurl 的異步特性實現(xiàn)并發(fā) RPC 調(diào)用的 yar 擴(kuò)展。幾乎整個社區(qū)都在尋找 PHP 的摩西之路。好吧,說了一大堆,回歸主題。之前我寫了一篇英文練筆《Why you PHP guys should learn Golang》,獲得不少國際友人的關(guān)注。排除拼寫和語法被他們詬病外,主要是有許多朋友覺得我沒把事情說清楚。所以這里我用母語重新聊聊這個事情,只是這些國際友人什么時候能學(xué)會閱讀中文呢?;)Go 或者 Golang,是由 Google 支持的快速、一致、穩(wěn)定的,有活躍的社區(qū)支持的開源編程語言。越來越多的應(yīng)用選擇使用 Golang 進(jìn)行構(gòu)建。雖然 Rob Pike 說“… 我們希望 C++ 程序員來了解 Go 并作為一個可選的語言 …”,不過我真得認(rèn)為:PHPer 應(yīng)當(dāng)學(xué)習(xí) Golang! 接下來我們就來談?wù)勗?。容易學(xué)習(xí)PHP 相當(dāng)容易學(xué)習(xí)。Golang 也是!在這點上,一群大老外對我的觀點進(jìn)行了猛烈的抨擊。他們認(rèn)為我羞辱了 PHPer,說得好像只有簡單的東西 PHPer 才能學(xué)會一樣。但是,這難道不是事實嗎?或者換個說法:像我一樣的喜歡 PHP 的人,或多或少都會更喜歡簡單的東西。PHP 的語法接近 C 族編程語言(C/C++/Java等等)。如果有這些語言的經(jīng)驗,在第一次遇到 PHP 的時候立刻就能開始上手編寫代碼。在我看來,編寫 PHP 代碼或許更加考驗程序員的記憶力,而不是智力(當(dāng)你面對各種不同風(fēng)格的函數(shù)定義、各種擴(kuò)展的特殊約定時,你一定會相當(dāng)認(rèn)同我的觀點)。Golang 同樣是一個 C 族編程語言。呃,或者有一些不同吧。例如關(guān)鍵字 “for”,功能上和 PHP 的接近,但是沒有括號。條件語句 “if” 同樣無需括號。可以閱讀 Effective Go 了解更多內(nèi)容。Golang 只有 3025 個關(guān)鍵字和 47 個操作符號、分隔符號或其他特殊標(biāo)記。記住這些標(biāo)記確實不需要什么特別的努力。精巧的類型系統(tǒng)相當(dāng)容易使用。實用的,具有方法的結(jié)構(gòu)體類型代替了笨重的對象系統(tǒng)。接口的設(shè)計是 Golang 中我最喜歡的部分。當(dāng)完成了《Go 指南》的學(xué)習(xí)之后,利用 PHP 積累的經(jīng)驗,立刻就可以開始使用 Golang 處理一些簡單的任務(wù)。容易使用PHP 腳本是由 SAPI 組件進(jìn)行解析執(zhí)行的,如 Web 服務(wù)器模塊、PHP-FPM 或者 CLI。部署 PHP 所需要的全部東西就是一個 SAPI 環(huán)境。配置這個環(huán)境對于新手來說可能是學(xué)習(xí) PHP 過程中最為困難的部分。所有的 Golang 代碼會編譯和鏈接為本地碼。所以除了編譯環(huán)境,執(zhí)行時無需再為其進(jìn)行任何特別的部署。對比 PHP 環(huán)境的配置,這要簡單很多。你真得認(rèn)為配置 PHP 環(huán)境很復(fù)雜嗎?我不覺得,真的!而配置 Golang 編譯環(huán)境比那還要簡單點。我確信已經(jīng)有大量的 Golang 相關(guān)的書籍、文章介紹過如何進(jìn)行編譯環(huán)境的配置了。為了更加清晰,我這里梳理一下思路。
有三個步驟需要處理:下載Golang 的源代碼;根據(jù)《[翻譯]Go 環(huán)境設(shè)置》的提示設(shè)置環(huán)境變量;運(yùn)行源代碼 src 目錄中的 all.bash?;蛘咭徊降轿唬菏褂枚M(jìn)制包進(jìn)行安裝。然后就會得到一個叫做“go”的工具集合。使用“go”工具和使用 PHP 的 CLI 工具一樣簡單?!禰翻譯]go 工具》對此進(jìn)行了詳細(xì)的解釋。PHP 的迷思如果一個編程語言容易學(xué)習(xí)和使用,我們是不是就應(yīng)當(dāng)學(xué)習(xí)它呢?有許多容易學(xué)習(xí)和使用的編程語言。難道要把它們都學(xué)一遍?答案是顯然的:NO!但是 呢?只是因為它很酷!是的,我在開玩笑,但是這是真的。無論如何先從 PHP 自身談起吧。PHP “原本是為了開發(fā)動態(tài)的 Web 頁面而設(shè)計的服務(wù)器端通用語言(Wikipedia)”。PHP 一個重要的特性就是可以嵌入到 HMTL 中。代碼編寫在“?php … ?”標(biāo)簽內(nèi);HTML 寫在標(biāo)簽外。它有一個強(qiáng)大的擴(kuò)展系統(tǒng)。擴(kuò)展使用 C 調(diào)用 Zend API 編寫。數(shù)據(jù)的處理實際上要利用這些擴(kuò)展完成。在我看來,PHP 是世界上最好的模板語言。但是當(dāng)積累了一些 PHP 的經(jīng)驗,并且開始面對一些更加復(fù)雜的 Web 應(yīng)用時,你一定會對 PHP 產(chǎn)生一種無力的感覺。它沒有內(nèi)建的并行機(jī)制,沒有線程、進(jìn)程(你真得認(rèn)為那個簡陋的進(jìn)程控制可以不加改造的用在高并發(fā)的生產(chǎn)環(huán)境?),或者其他某“程”。一個慢數(shù)據(jù)源可以阻塞整個頁面的處理。消息隊列、緩存、代理……系統(tǒng)開始不僅僅是 PHP 這么單純,還包括了許多服務(wù)和系統(tǒng)組件。這時,PHP 只處理很少的業(yè)務(wù)邏輯,成為真正的模板語言了。PHPer 們總是在尋找解決這一問題的辦法,如“PHP multithread”或者PHP RPC 并發(fā)框架。我很難說哪種會更好一些。不過我肯定你會需要選擇一些編程語言用于后端工作的開發(fā)。就我自己的經(jīng)驗,我嘗試過 C(一直在和 malloc/free 進(jìn)行搏斗)/Java(陷入到了 jar 地獄中)/Python(從來沒能做到 Pythonic 不說,還總是在錯誤的類型中打轉(zhuǎn))……如果想要獲得性能,就得同內(nèi)存管理進(jìn)行搏斗;如果用 GC,就得部署和調(diào)優(yōu) VM;當(dāng)獲得便利性的時候,同時也是走在刀尖上,一個小錯誤就引起巨大的災(zāi)難……每個都有優(yōu)勢,同樣每個都有問題。好吧!現(xiàn)在回到 Golang!Golang 有 GC,無需關(guān)心內(nèi)存管理(或者可以用較少的精力去關(guān)注它)。代碼被編譯為本地碼,因此“cp”和“mv”就是部署 Golang 編寫的應(yīng)用所需要的全部工具。噢,我剛才已經(jīng)說過了,Golang 是一個具有靜態(tài)類型系統(tǒng)的編譯語言。所以你沒有機(jī)會弄亂變量的類型。當(dāng)然,PHPer 應(yīng)該學(xué)習(xí) Golang 的一個重要原因是“轉(zhuǎn)到Go 是因為他們并未放棄太多的表達(dá)能力,但是獲得了性能,并且與并發(fā)共舞(Rob Pike)”?!禬hy Not Go?(英文)》對此進(jìn)行了深入的分析。我可以分享一些我的經(jīng)驗:有一個 Gearman 的worker 用于處理后端數(shù)據(jù)。PHP 通過其 API 連接到 Gearman 的 Job Server 向 worker 發(fā)起請求。最初 worker 是使用 python 編寫的(還有更加原始的版本,PHP 的,但是你能想像它工作起來……唉,不說了……)。這個版本有許多的問題(是我們自己的問題,不關(guān) Python 的事),但是至少它能工作。后來用 Golang 重寫了這個 worker。為此我開發(fā)了 Golang 的 Gearman API,并使用 Zend API 編寫了一個在 Golang 中執(zhí)行 PHP 腳本的包。然后將它們放在一起:一個可以執(zhí)行 PHP 的 Gearman worker。它已經(jīng)工作了一段時間了,看起來還不錯!哦,受到 Yar 的啟發(fā),這里還有一個 Golang 編寫的 RPC 合并器,用來合并 PHP 腳本中的 RPC 調(diào)用?,F(xiàn)在還是個玩具,不過或許日后能用得著。這其實是將 Golang 的 channel 當(dāng)作消息隊列來用。我在《Golang:有趣的 channel 應(yīng)用》中對此有一些說明。世界真美好啊。謝謝 Golang!無論如何,大多數(shù) PHPer 在進(jìn)行后端開發(fā)的時候都會需要學(xué)習(xí)一些其他語言。如果你正在尋找,或者已經(jīng)嘗試了一些其他語言。為什么不來試試 Golang?它真得可以讓你的生活更加輕松和快樂。讓你可以有更多的時間陪伴你的家人和朋友,吃你愛吃的東西,去你想去的地方。貌似我還是沒說清楚???好吧,沒關(guān)系,在下個月的中國軟件開發(fā)者大會上再跟大家就這個話題做一個探討吧。
難點如下:
1、php大部分處理的是字符串,而go大部分時候要涉及到字節(jié)的處理。
2、php大部分時候可以忽略變量類型,而go是強(qiáng)類型的。
3、php的語法簡單,而go的語法新潮一時半會接受不了可以理解。比如 a:=10。
上面的難點,對有學(xué)習(xí)過其它強(qiáng)類型語言的php程序員,都不是事。