首頁  >  文章  >  後端開發  >  簡潔版PHP程式設計師學習路線與學習建議

簡潔版PHP程式設計師學習路線與學習建議

伊谢尔伦
伊谢尔伦原創
2017-01-23 13:52:101143瀏覽

為了你可以更好地學習PHP,這次主要是想說一下PHP的學習線路,梳理了每個階段PHP程式設計師的技術要求,根據自己的情況做對照設定學習成長目標。

適用於PHP初學者的學習線路和建議

我們要有一個循序漸進的學習過程,這裡先把學習PHP的過程做一下概括,這和很多學習PHP的愛好者是不謀而合的:

  (1) 熟悉HTML/CSS/JS、、網頁基本元素,完成階段可自行製作簡單的網頁,對元素屬性相對熟悉

  (2) 理解動態語言的概念和運做機制,熟悉基本的PHP語法

  (3) 學習如何將PHP與HTML結合起來,完成簡單的動態頁

  (4) 接觸學習MySQL,開始設計資料庫

  (5) 不斷鞏固PHP常用語法,熟悉大部分的PHP常用語法,熟悉大部分的PHP常用語法,熟悉大部分的PHP常用語法,熟悉大部分的PHP常用語法,熟悉大部分的PHP常用語法,熟悉等的常用文法物件導向編程,MySQL優化,以及一些模板和框架

  (6) 最終完成一個功能齊全的動態站點

  新手不要看到上面的概括就以為PHP學習是很簡單的,編程是需要你認真的思考編程是需要你認真的思考編程和不斷的實踐。 以下具體解釋一下PHP的學習線。 首先,任何網站都是由網頁組成的,也就是說想完成一個網站,必須先學會做網頁,掌握靜態網頁的製作技術是學習開發網站的先決條件。 因此我們要學習HTML,為未來製作網站奠定基礎。 學習HTML應該邊學邊做,HTML中的任何元素都要親自實踐,只有明白了什麼元素會起到什麼效果之後,才能深刻記憶,一味的看書是不行的

  假設你已經可以完成一個靜態頁面了,那麼就該開始了解動態語言,剛一接觸動態語言,可能很多人都會擁有很多不解,程式碼不是作為直接輸出的,而是要經過處理的,HTML是經過HTML解析器,而PHP也要透過PHP解析器,跟學習HTML一樣的道理,想讓任何的解析器工作,就必須使用它專用的語法結構

  學習PHP,你應該感到幸運,因為如果你學過其他語言,你就會發現PHP還是相對簡單的,這一階段,你要搞清楚HTML和PHP的概念,你現在完全可以讓PHP給你算算一加一、於幾,然後在瀏覽器輸出。 不要覺得幼稚,這雖然是很小的一段程式碼,但是對於你的程式設計之路,可是邁出了一大步。 不過現在,你還是個菜鳥

  接下來就要學習資料庫了,MySQL可以說是PHP的黃金搭檔,我們要征服這個資料庫,在你理解了資料庫的概念之後,就要嘗試透過PHP來連結資料庫,進而會用PHP成功的插入,刪除並更新資料

  這個時候,你可能會處於這種狀態:你會HTML嗎?會,我可以編好幾個表格排板的網頁呢!你會PHP嗎?會,我會把一加一的運算寫在函數裡,然後呼叫!你會MySQL嗎?會,我可以把資料庫裡的資料插入刪除啦!

  那接下來該做什麼呢?試著著做個小的留言本吧,這同樣是新手面臨的關卡。 花了一段時間,你終於學會把表單的資料插入資料庫,然後顯示出來了,應該要說一個程式的雛形已經誕生了。 但是,你可能會看人家這個編論壇,那個開發CMS,我什麼時候可以寫一個呢?不要著急,再鞏固一下知識,熟悉了PHP和MySQL開發的要領後,再回頭看你寫的那個留言本,你也許會懷疑那真的是你寫的嗎?這時候,你可以精進一下你寫的留言本。 留言本來應該要加入註冊以及分頁的功能,可以的話,UI也可以加強

  這就算學會了嗎? NO,NO,NO,還早呢,你到現在還沒碰過OOP呢?那模板和框架呢?還要繼續學習呀! PHP框架提供了一個用來建構web應用的基本框架,從而簡化了用PHP編寫web應用程式的流程。 可以節省開發時間、有助於建立更穩定的應用。 所以說,PHP框架是一個可以用來節省時間並強化自己程式碼的工具。 當你第一次選擇PHP框架時,建議多嘗試幾個,每個框架都有自己的長處和短處,例如Zend框架由於多樣的功能、、並且有一個廣泛的支持系統,流行了很長時間。 而c++akePHP是一個晚於Zend的PHP框架,相應的支援系統也比較少,但是更為方便和易於使用

  了解了面向對象和框架後,你應該接觸一下XML了,總而言之,你絕對不會發現你全部都學會了,學無止境!學東西,永遠不要妄想有速成這一說,技巧再多,但是缺少努力,那也是白搭。 有一點可以保證,就是你學會了PHP,那麼再學其它語言,肯定速成,反過來也一樣,如果你之前學過其它的語言,那麼學PHP肯定快

  多藉鏡別人成功的程式碼,絕對是有益無害,所以要多看那些經過千錘百煉凝出來的經典程式碼,是進步的最好方法。 另外,要強調的是,學習一項技術過程中可能會遇到困難,可能會迷茫,你也許學了一半的PHP,又開始打C#的主意,或者有人說Java很好,這個時候你絕對不能動搖,要堅持到底,徹底學會。

下面我們分階段來討論一下學習的過程:

第一階段:基礎階段(基礎PHP程式設計師)

重點:把LNMP搞熟練(核心是安裝配置基本操作)

目標:能夠完成基本的LNMP系統安裝,簡單配置維護;能夠做基本的簡單系統的PHP開發;能夠在PHP中型系統中支援某個PHP功能模組的開發。

時間:完成本階段的時間因人而異,有的成長快半年一年就過了,成長慢的兩三年也有。

1.Linux

基本命令、操作、啟動、基本服務配置(包括rpm安裝文件,各種服務配置等);會寫簡單的shell腳本和awk/sed 腳本命令等。

2.Nginx

做到能夠安裝配置nginx+php,知道基本的nginx核心配置選項,知道 server/fastcgi_pass/access_log 等基礎配置,目標是能夠讓讓自己讓自己順利工作的nginx核心配置選項。

3.MySQL

會自己搭建mysql,知道基本的mysql配置選項;知道innodb和myisam的區別,知道針對InnoDB和MyISAM兩個引擎的不同配置選項;知道基本的兩個引擎的差異和選擇上面的區別;能夠純手工編譯搭建一個MySQL資料庫並且配置好編碼等正常穩定運行;核心主題是能夠搭建一個可運行的MySQL資料庫。

4.PHP

基本語法數組、字串、資料庫、XML、Socket、GD/ImageMgk圖片處理等等;熟悉各種跟MySQL操作連結的api(mysql/mysqli/PDO),知道各種編碼問題的解決;知道常規熟練使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf等);了解基本MVC的運行機制和為什麼這麼做,稍微知道不同的PHP框架之間的區別;能夠快速學習一個MVC框架。能夠知道開發工程中的文件目錄組織,有基本的良好的程式碼結構和風格,能夠完成小系統的開發和中型系統 中某個模組的開發工作。

5.前端

如果條件時間允許,可以適當學習下HTML/CSS/JS 等相關知識,知道什麼web標準,div+css的web/wap頁面模式,知道HTML5和HTML4的區別;了解一些基本的前端只是和JS框架(jQuery之類的);了解一些基本的JavaScript程式設計知識;(本項不是必須項,如果有時間,稍微了解一下是可以的,不過不建議作為重點,除非個人有強烈興趣)。

6.系統設計

能夠完成小型系統的基本設計,包括簡單的資料庫設計,能夠完成基本的:瀏覽器-> Nginx+PHP -> 資料庫架構的設計開發工作;能夠支撐每天幾十萬到數百萬流量網站的開發維護工作;

第二階段:提高階段(中級PHP程式設計師)

重點:提高針對LNMP的技能,能夠更全面的對LNMP有熟練的應用。

目標:能夠隨時隨地搭建好LNMP環境,快速完成常規配置;能夠追蹤解決大部分遇到的開發和線上環境的問題;能夠獨立承擔中型系統的架構和開發工作;能夠在大型系統中承擔某個中型模組的開發工作。

1. Linux

在第一階段的基礎上面,能夠流暢的使用Shell腳本來完成很多自動化的工作;awk/sed/perl 也操作的不錯,能夠完成很多文本處理和數據統計等工作;基本能夠安裝大部分非特殊的Linux程式(包括各種函式庫、​​套件、第三方依賴等等,例如MongoDB/Redis/Sphinx/Luncene/SVN之類的);了解基本的Linux服務,並知道如何查看Linux的效能指標數據,知道基本的Linux下面的問題追蹤等。

2. Nginx

在第一階段的基礎上面,了解複雜一些的Nginx配置;包括多核配置、events、proxy_pass,sendfile/tcp_*配置,知道超時等相關配置和效能影響;知道nginx除了web server ,也能夠承擔代理伺服器、反向靜態伺服器等配置;知道基本的nginx配置調優;知道如何配置權限、編譯一個nginx擴展到nginx;知道基本的nginx運作原理(master/worker機制,epoll),知道為什麼nginx效能比apache效能好等知識。

3. MySQL/MongoDB

在第一階段的基礎上面,在MySQL開發方面,掌握很多小技巧,包括常規SQL優化(group by/order by/rand優化等);除了能夠搭建MySQL,還能夠冷熱備份MySQL數據,還知道影響innodb/myisam效能的配置選項(例如key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size /innodb_flush_log_at_trx_commit等),也知道這些選項配置成為多少值同步;另外也了解一些特殊的配置選項,例如知道如何建立mysql,例如從主同步的合適值;環境,知道各個binlog_format的差別;知道MySQL的效能追查,包括slow_log/explain 等,還能夠知道基本的索引建立處理等知識;原理方面了解基本的MySQL的架構(Server+儲存引擎),知道基本的InnoDB/ MyISAM索引儲存結構和不同(聚集索引,B樹);知道基本的InnoDB事務處理機制;了解大部分MySQL異常情況的處理方案(或知道哪裡找到處理方案)。條件允許 的情況,建議了解NoSQL的代表MongoDB資料庫,順便比較跟MySQL的差別,同事能夠在合適的應用場景安全謹慎的使用MongoDB,知道 基本的PHP與MongoDB的結合開發。

4. Redis/Memcached

在大部分中型系統裡面一定會涉及到快取處理,所以一定要了解基本的快取;知道Memcached和Redis的異同和應用場景,能夠獨立安裝Redis/Memcached,了解Memcahed的一些基本特性和限制,例如最大的value值,知道PHP跟他們的使用結合;Redis了解基本工作原理和使用,了解常規的資料類型,知道什麼場景應用什麼類型,了解Redis的事務等等。原理部分,能夠大概了解Memcached的記憶體結構(slab機制),redis就了解常用資料型別底層實作儲存結構(SDS/鍊錶/SkipList/HashTable)等等,順便了解Redis 的事務、RDB、AOF等機制更好。

5. PHP

除了第一階段的能力,安裝配置方面能夠隨意安裝PHP和各種第三方擴充功能的編譯安裝配置;了解php-fpm的大部分配置選項和意義(如max_requests/max_children /request_terminate_timeout之類的影響性能的配置),知道mod_php/fastcgi的區別;在PHP方面已經能夠熟練各種基礎技術,還包括各種深入些的PHP,包括對PHP面向對象的深入理解/SPL/語法層面的特殊特性如反射之類的;在框架方面已經閱讀過最少一個以上常規PHP MVC框架的程式碼了,知道基本PHP框架內部實現機制和設計思想;在PHP開發中已經能夠熟練使用常規的設計模式來應用開發(抽象工廠/單例/觀察者/命令鏈/策略/適配器等模式);建議開發自己的PHP MVC框架來充分讓開發自由化,讓自己深入理解MVC模式,也讓自己能夠在業務專案中開發裡快速升級;熟悉PHP的各種程式碼最佳化方法,熟悉大部分PHP安全性方面問題的解決處理;熟悉基本的PHP執行的機制原理(Zend引擎/擴展基本工作機制)。

6. C/C++

開始涉獵一定的C/C++語言,能夠寫基本的C/C++程式碼,對基本的C/C++語法熟悉(指標、陣列操作、字串、常規標準API)和數據結構(鍊錶、 樹、哈希、佇列)有一定的熟悉下;對Linux下面的C語言開發有基本的了解概念,會簡單的makefile檔案編寫,能夠使用簡單的GCC/GDB的程式編譯簡單調試工作;對基本的網路程式設計有大概了解。 (本項是為了向更高層次打下基礎)。

7. 前端

在第一階段的基礎上面,熟悉基本的HTTP協議(協議代碼200/300/400/500,基本的HTTP交互頭);條件允許,可以在深入寫出稍微優雅的HTML +CSS+JavaScript,或是能夠大致簡單使用某些前端框架(jQuery/YUI/ExtJS/RequireJS /BootStrap之類);如果條件允許,可以深入學習JavaScript編程,例如閉包機制、DOM處理;再深入些可以讀讀jQuery原始碼做深入學習。 (本項不做重點學習,除非對前端有興趣)。

8. 系統設計

能夠設計大部分中型系統的網站架構、資料庫、基本PHP框架選型;效能測試排查處理等;能夠完成類似:瀏覽器-> CDN(Squid) -> Nginx+PHP - > 快取-> 資料庫結構網站的基本設計開發維護;能夠支撐每天數百萬到千萬流量基本網站的開發維護工作;

第三階段:高級階段(高級PHP程式設計師)

重點:除了基本的LNMP程序,也能夠在某個方向或領域有深入學習。 (縱深維度發展)

目標:除了能夠完成基本的PHP業務開發,還能夠解決大部分深入複雜的技術問題,並且可以獨立設計完成中大型的系統設計和開發工作;自己能夠獨立hold深入某個技術方向,在這塊比較專業。 (如在MySQL、Nginx、PHP、Redis等任何方向深入研究)

1. Linux

除了第二階段的能力,在Linux下面除了常規的操作和性能監控跟踪,還能夠使用很多高級複雜的命令完成工作(watch/tcpdump/starce /ldd/ar等);在shell腳本方面,已經能夠編寫比較複雜的shell腳本(超過500行)來協助完成許多包括備份、自動化處理、監控等工作的shell;對awk/sed/perl 等應用已經如火純青,能夠隨意操作控制處理文本統計分析各種複雜格式的資料;對Linux內部機制有一些了解,對核心模組加載,啟動錯誤處理等等有基本的處理;同時對一些其他相關的東西也了解,例如NFS、磁碟管理等等;

2. Nginx

在第二階段的基礎上面,已經能夠把Nginx操作的很熟練,能夠對Nginx進行更深入的運維工作,比如監控、性能優化,複雜問題處理等等;看個人興趣,更多方面可以考慮專注於關於Nginx工作原理部分的深入學習,主要表現在閱讀源碼開始,比如具體的master/worker工作機制,Nginx內部的事件處理,內存管理等等;同時可以學習Nginx擴展的開發,可以客製化一些自己私有的擴充;同時可以對Nginx+Lua有一定程度的了解,看看是否可以結合應用出更好模式;這個階段的要求是對Nginx原理的深入理解,可以考慮成為Nginx方向的深入專業者。

3. MySQL/MongoDB

在第二階段的基礎上面,在MySQL應用方面,除了之前的基本SQL優化,還能夠在完成一些複雜操作,比如大批量數據的導入導出,線上大批量數據的更改表結構或增刪索引欄位等等高風險操作;除了安裝配置,已經能夠處理更多複雜的MySQL的問題,例如各種問題的追查,主從同步延遲問題的解決、跨機房同步資料方案、MySQL高可用架構等都有涉及了解;對MySQL應用層面,對MySQL的核心關鍵技術比較熟悉,例如事務機制(隔離等級、鎖定等)、對觸發器、分區等技術有一定了解與應用;對MySQL效能方面,包括磁碟最佳化(SAS遷移到SSD)、伺服器最佳化(記憶體、伺服器本身配置)、除了二階段的其他核心效能最佳化選項(innodb_log_buffer_size/back_log /table_open_cache/thread_cache_size/innodb_lock_wait_timeout等)、連接池軟體選擇,對show *(show status/show profile)類別的操作語句有深入了解,能夠完成大部分的效能問題追蹤;MySQL備份技術的深入熟悉,包括災備還原、對Binlog的深入理解,冷熱備份,多IDC備份等;在MySQL原理方面,有更多了解,例如對MySQL的工作機制開始閱讀部分源碼,例如對主從同步(複製)技術的源碼學習,或者對某個存儲引擎(MyISAM/Innodb/ TokuDB)等等的原始碼學習理解,如果條件允許,可以參考CSV引擎開發自己簡單的儲存引擎來保存一些數據,增強對MySQL的理解;在這個過程,如果自己有興趣,也可以考慮往DBA方向發展。 MongoDB層面,可以考慮比如說在寫少讀多的情況開始在線上應用MongoDB,或者是做一些線上的資料分析處理的操作,具體場景可以按照工作來,不過核心是要更好的深入理解RMDBS和NoSQL的不同場景下面的應用,如果條件或興趣允許,可以開始深入學習MongoDB的工作機制。

4. Redis/Memcached

在 第二階段的基礎上面,能夠更深入的應用與學習。因為Memcached不是特別複雜,建議可以把源碼進行閱讀,特別是內存管理部分,方便深入理解;Redis部分,可以多做一些複雜的數據結構的應用(zset來做排行榜排序操作/事務處理用來保證原子性在秒殺類場景應用之類的使用操作);多涉及aof等同步機制的學習應用,設計一個高可用的Redis應用架構和集群;建議可以深入的學習一下Redis的源碼,把在第二階段累積的知識都可以應用上,特別可以閱讀包括核心事件管理、記憶體管理、內部核心資料結構等充分學習了解一下。如果興趣允許,可以成為一個Redis方面非常專業的使用者。

5. PHP

作 為基礎核心技能,我們在第二階段的基礎上面,需要有更深入的學習和應用。從基本程式碼應用上面來說,能夠解決在PHP開發中遇到95%的問題,了解大部分PHP的技巧;對大部分的PHP框架能夠迅速在一天內上手使用,並且了解各個主流PHP框架的優缺點,能夠快速方便專案開發中做技術選型;在配置方面,除了常規第二階段會的知識,會了解一些比較偏門的配置選項(php auto_prepend_file/auto_append_file),包括擴充中的一些複雜高級配置和原理(例如memcached擴展配置中的memcache.hash_strategy、apc擴展配置中的apc.mmap_file_mask/apc.slam_defense /apc.file_update_protection之類的);對php的工作機制比較了解,包括php-fpm工作機制(例如php-fpm在不同配置機器下面開啟進程數量計算以及原理),對zend引擎有基本熟悉(vm/gc/stream處理),閱讀過基本的PHP內核源碼(或者閱讀過相關文章),對PHP內部機制大部分的核心資料結構(基礎類型/Array/Object)實現有了解,對於核心基礎結構(zval/hashtable /gc)有深入學習了解;能夠進行基本的PHP擴展開發,了解一些擴展開發的中高級知識(minit/rinit等),熟悉php跟apache /nginx不同的通訊互動方式細節(mod_php/fastcgi);除了開發PHP擴展,可以考慮學習開發Zend擴展,從更底層去了解PHP。

6. C/C++

在第二階段基礎上面,能夠在C/C++語言方面有更深入的學習了解,能夠完成中小型C/C++系統的開發工作;除了基本第二階段的基礎C /C++語法和資料結構,也能夠學習一些特殊資料結構(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工作中需求; 在系統程式設計方面,熟悉多進程、多執行緒程式設計;多進程情況下面了解大部分多進程之間的通訊方式,能夠靈活選擇通訊方式(共享記憶體/信號量/管道等);多執行緒程式設計能夠良好的解決鎖定衝突問題,並且能夠進行多執行緒程式的開發調試工作;同時對網路程式設計比較熟悉,了解多進程模型/多執行緒模型/非同步網路IO模型的差異與選型,熟悉不同非同步網路IO模型的原理與差異(select/poll/epoll/ iocp等),並且熟悉常見的非同步框架(ACE/ICE/libev /libevent/libuv/Boost.ASIO等)和使用,如果閒暇也可以看看一些國產自己開發的庫(比如muduo);同時能夠設計好的高並發程式架構(leader-follow/master-worker等);了解大部分C/C++後端Server開發中的問題(記憶體管理、日誌列印、高並發、前後端通訊協定、服務監控),知道各個後端服務RPC通訊問題(struct/http/thirft/protobuf等);能夠更熟絡的使用GCC和GDB來開發編譯調試程序,在線上程序core掉後能夠迅速追查跟踪解決問題;通用模組開發方面,可以累積或開發一些通用的工具或函式庫(如非同步網路框架、日誌庫、記憶體池、執行緒池等),不過開發後是否應用要謹慎,省的埋坑去追bug。

7. 前端

深入了解HTTP協定(包括各個細緻協定特殊協定程式碼和背後原因,例如302靜態檔案快取了,502是nginx後面php掛了之類的);除了之前的前端方面的各種檔案快取了,502是nginx後面php掛了之類的);除了之前的前端方面的各種框架應用整合能力,前端方面的學習如果有興趣可以更深入,表現形式是,可以自己開發一些類似jQuery的前端框架,或者開發一個富文本編輯器之類的比較瑣碎考驗JavaScript功力。

8. 其他領域語言學習

在基礎的PHP/C/C++語言方面有基本積累,建議在當前階段可以嘗試學習不同的程式語言, 看個人興趣愛好,腳本類語言可以學學Python/Ruby之類的,函數式程式語言可以試試Lisp/Haskell/Scala/Erlang 之類的,靜態語言可以試試Java/Golang,資料統計分析可以了解了解R語言,如果想換個視角做後端業務,可以試試Node.js還有前面提到的跟Nginx結合的Nginx_Lua等。學習不同的語言主要是提升自己的視野和解決問題手段的差異,比如會了解除了進程/ 線程,還有輕量級協程;比如在跨機器通信場景下面,Erlang的解決方案簡單的驚人;比如在不想選擇C/C++的情況下,還有類似高效的Erlang /Golang可用等等;主要是提升視野。

9. 其他專業方向學習

In this stage, in addition to basic LNMP skills, we will also consider learning knowledge in other fields. These are all possible, depending on personal interests and long-term goals. At present, there are many fields to choose from, such as cloud computing (distributed storage, distributed computing, virtual machines, etc.), machine learning (data mining, pattern recognition, etc., applied to statistics, personalized recommendations), natural language processing ( Chinese word segmentation, etc.), search engine technology, graphics and images, speech recognition, etc. In addition to these advanced ones, there are also many areas where you can learn more about engineering, such as high-performance systems, mobile development (Android/IOS), computer security, embedded systems, hardware, etc.

10. System Design

Based on the second stage, system design can apply the experience and skills mastered to design relatively complex medium and large-scale systems, which can solve most online problems. Various complex system problems, such as browser-> CDN -> load balancing-> access layer-> Nginx+PHP -> business cache-> database-> various complex back-end RPC Interaction (storage backend, logic backend, anti-cheating backend, external services) -> More complex business of backend Jiangzi; able to support the normal development and maintenance of tens to hundreds of millions of traffic websites every day.

Finally, share 10 tips for PHP performance optimization to help you better develop with PHP:

1. Foreach is more efficient, try to use foreach instead of while and for loop

 2. Do not declare variables inside loops, especially variables such as objects

 3. In multiple nested loops, if possible, the longest loop should be placed in the inner layer , the shortest loop is placed in the outer layer, thereby reducing the number of times the CPU crosses the loop layer and optimizing program performance

 4. Use single quotes instead of double quotes to quote strings to achieve PHP performance optimization

 5. , use i+=1 instead of i=i+1. In line with the habits of c/c++, the efficiency is still high

 6. Optimize the Select SQL statement and perform as few Insert and Update operations as possible to achieve the purpose of PHP performance optimization

 7 ,, try to do as few file operations as possible, although PHP's file operation efficiency is not low

 8., Use PHP internal functions as much as possible

9., You can use PHP internal characters In the case of string operation functions, do not use regular expressions

 10. Feof, fgets, fopen, and when file_get_contents can be used instead of file or series methods, try to use file_get_contents because it is much more efficient. . But please pay attention to the PHP version problem of file_get_contents when opening a URL file


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn