要點:讓LNMP精通(核心是安裝和配置的基本操作)?目的:完成基本的LNMP系統安裝、簡單配置和維護;能夠進行基本和簡單的系統PHP開發;可以支持PHP中型系統中PHP功能模塊的開發。?
時間:完成這壹階段的時間因人而異。有些人長得比半年還快,而有些人長得比兩三年還慢。?
Linux?
基本命令、操作、啟動和基本服務配置(包括rpm安裝文件和各種服務配置等。);可以編寫簡單的shell腳本和awk/sed腳本命令。?
Nginx?
能夠安裝和配置nginx+php,知道基本的nginx核心配置選項,知道server/fastcgi_pass/access_log等基本配置。目標是讓nginx+php_fpm順利工作。?
MySQL?
會自己搭建mysql,知道基本的mysql配置選項;了解innodb和myisam的區別,了解InnoDB和MyISAM引擎的不同配置選項;知道兩種引擎的基本區別,並選擇上述區別;可以手工編譯構建MySQL數據庫並配置編碼正常穩定運行;核心思想是能夠構建壹個可操作的MySQL數據庫。?
PHP?
基本語法數組、字符串、數據庫、XML、Socket、GD/ImageMgk圖像處理等。熟悉與mysql操作相關的各種API(MySQL/mysqli/PDO),並知道如何解決各種編碼問題;熟悉PHP框架(ThinkPHP、Zendframework、Yii、Yaf等。);了解基本MVC的運行機制以及為什麽這樣做,並對不同PHP框架之間的差異略知壹二;可以快速學習壹個MVC框架。能夠了解開發工程中的文件目錄組織,具有良好的基本代碼結構和風格,能夠完成小型系統和中型系統中壹個模塊的開發。
前端?
如果時間允許,可以學習HTML/CSS/JS等相關知識,知道什麽web標準,div+css的web/wap頁面模式,知道HTML5和HTML4的區別。了解壹些基本的前端只與JS框架相關(如jQuery);了解壹些基本的JavaScript編程知識;(這壹項不是必須的。如果妳有時間,可以稍微了解壹下,但不建議專註於此,除非妳有濃厚的興趣。).?
系統設計?
能夠完成小型系統的基本設計,包括簡單的數據庫設計,能夠完成基本的:瀏覽器-》;nginx+PHP-& gt;數據庫架構的設計和開發;可以支撐每天幾十萬到幾百萬流量的網站開發和維護;
第二階段:提高階段(中級PHP程序員)?
重點:提高LNMP的技能,能夠更全面地熟練應用LNMP。?目的:隨時隨地建立良好的LNMP環境,快速完成常規配置;能夠跟蹤和解決開發和在線環境中遇到的大部分問題;能夠獨立承擔中型系統的框架和開發;能夠承擔大型系統中壹個中型模塊的開發。?
1.Linux?
在第壹階段的基礎上,我們可以順利地使用Shell腳本完成大量的自動化工作;Awk/sed/perl也運行良好,可以完成大量的文本處理和數據統計。基本能夠安裝大部分非專用Linux程序(包括各種庫、包、第三方依賴等。,如MongoDB/Redis/Sphinx/LUN cene/SVN);了解基本的Linux服務,知道如何查看Linux的性能指標數據,知道Linux下的基本問題跟蹤。?
2.Nginx?
在第壹階段的基礎上,了解更復雜的Nginx配置;包括多核配置、事件、proxy_pass、sendfile/tcp_*配置、知乎超時等相關配置及性能影響;要知道nginx除了web服務器之外還可以承擔代理服務器、反向靜態服務器等的配置;了解基本的nginx配置調整;知道如何配置權限並編譯壹個nginx擴展到nginx;了解nginx(master/worker mechanism,epoll)的基本工作原理,並知道為什麽nginx的性能優於apache。?
3.MySQL/MongoDB?
在第壹階段的基礎上,我已經掌握了MySQL開發中的許多技巧,包括通用SQL優化(group by/order by/rand優化等。);除了構建MySQL之外,還可以對MySQL數據進行熱備份和冷備份,以及配置選項(如key _ buffer/query _ cache/sort _ buffer/innodb _ buffer _ pool _ size/innodb _ flush _ log _ at _ Trx _ commit等。)也是已知的,並且這些選項的適當值也是已知的。還知道壹些特殊的配置選項,例如?知道如何構建mysql主從同步環境,知道binlog_format的區別;了解MySQL的性能跟蹤,包括slow_log/explain等。,並了解指標建立和處理的基本知識;了解基本的MySQL架構(服務器+存儲引擎)和基本的InnoDB/MyISAM索引存儲結構和差異(聚集索引、B樹);了解基本的InnoDB事務處理機制;了解大多數MySQL異常的解決方案(或者知道在哪裏可以找到解決方案)。如果條件允許,建議了解壹下NoSQL的代表性數據庫MongoDB,並與MySQL進行比較。同事們可以在合適的應用場景中安全謹慎地使用MongoDB,並了解基本PHP和MongoDB的組合開發。?
4.Redis/Memcached?
大多數中型系統都會涉及到緩存處理,因此您必須了解基本緩存;知道Memcached和Redis的異同及其應用場景,能夠獨立安裝Redis/Memcached,了解Memcached的壹些基本特性和限制,例如最大值,並知道PHP與它們的使用相結合;Redis了解基本的工作原理和用法,壹般的數據類型,在什麽場景中使用什麽類型,以及Redis的事務。在原理部分,我們可以大致了解Memcached的內存結構(slab機制),redis可以了解常見數據類型的底層存儲結構(SDS/linked list/skip list/HashTable),順便了解壹下Redis的事務、RDB、AOF等機制更好。
5.PHP?
除了第壹階段的能力外,安裝配置可以隨意安裝PHP和各種第三方擴展;了解php-fpm的大部分配置選項和含義(如Max _ Requests/Max _ Children/Request _ termin ate _ time out等影響性能的選項),知道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/ext js/require js/bootstrap等)。如果條件允許,可以深入學習JavaScript編程,比如閉包機制和DOM處理;如果妳想深入了解,可以閱讀jQuery源代碼進行深入研究。除非妳對前端感興趣,否則不要專註於此項目。
8.系統設計?
能夠設計大多數中型系統的網站架構、數據庫和基本PHP框架選擇;性能測試故障排除等。;可以完成類似於:瀏覽器-& gt;CDN(Squid)-》;nginx+PHP-& gt;緩存-& gt;數據庫結構網站的基本設計、開發和維護;可以支撐每天幾百萬到幾千萬流量的基礎網站的開發和維護;?
第三階段:高級階段(高級PHP程序員)?
重點:除了基本的LNMP項目,妳還可以在某個方向或領域進行深入學習。(深度維度開發)?目標:除完成基本的PHP業務開發外,還能解決大部分深度和復雜的技術問題,並能獨立設計和完成中大型系統的設計和開發工作;我可以獨立持有某個技術方向,在這壹塊比較專業。(例如在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的工作原理,主要是在閱讀源代碼方面,比如Nginx內部具體的master/worker工作機制、事件處理、內存管理等等;同時,您可以學習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 _ time out等。),連接池軟件選擇應用程序,對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用於排名操作/事務處理,以確保spike場景和其他應用中的原子性);主要涉及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 engine(VM/GC/stream processing)有基本的了解,閱讀php內核的基本源代碼(或閱讀相關文章),對php內部機制的大多數核心數據結構(基本類型/數組/對象)有所了解,對核心基礎設施有所了解。能夠進行基本的php擴展開發,了解壹些擴展開發的高級知識(minit/rinit等。),並熟悉PHP與Apache/nginx(mod _ PHP/fastcgi)之間的通信交互細節;除了開發PHP擴展之外,您還可以考慮學習開發Zend擴展,以便從較低的級別了解PHP。
6.C/C++?
在第二階段的基礎上,我可以學習更多關於C/C++語言的知識,並完成中小型C/C++系統的開發。除了第二階段的基本C/C++語法和數據結構外,我們還可以學習壹些特殊的數據結構(B樹/Rb樹/Skiplist/LSM樹/Trie樹等)。)以滿足特殊工作中的需要。在系統編程方面,熟悉多進程和多線程編程;在多進程的情況下,我了解大多數多進程之間的通信模式,並可以靈活選擇通信模式(* * *共享內存/信號量/管道等。);多線程編程可以很好地解決鎖沖突問題,可以開發和調試多線程程序;同時熟悉網絡編程,多進程模型/多線程模型/異步網絡IO模型的區別和選擇,不同異步網絡IO模型的原理和區別(select/poll/epoll/iocp等。),以及常見的異步框架(ace/ice/libev/libevent/libuv/boost。asio等。)及其用途。有空的話也可以看看國內的壹些自研庫。同時,它可以設計出良好的高並發程序架構(leader-follow/master-worker等。);了解C/C++後端服務器開發中的大多數問題(內存管理、日誌打印、高並發、前後端通信協議、服務監控),了解各種後端服務的RPC通信問題(struct/http/thirft/protobuf等。);能夠更熟練地使用GCC和GDB開發編譯和調試程序,並能在在線程序核心掉線後快速跟蹤和解決問題;在通用模塊的開發中,我們可以積累或開發壹些通用工具或庫(如異步網絡框架、日誌庫、內存池、線程池等。),但開發後要謹慎是否應用它們,以免埋下bug。?
7.前端?
對HTTP協議的深入理解(包括各種詳細協議的特殊協議代碼及其背後的原因,如302靜態文件緩存,502背後nginx和php掛了);除了之前各種框架的前端應用集成能力之外,如果有興趣還可以加深前端的學習。表現形式是妳可以自己開發壹些類似jQuery的前端框架,或者開發壹個富文本編輯器來測試JavaScript技能。
8.其他領域的語言學習?
有基礎PHP/C/C++語言的基礎積累。建議妳可以在這個階段嘗試學習不同的編程語言,這取決於妳的個人興趣。腳本語言可以學習Python/Ruby,函數式編程語言可以嘗試Lisp/Haskell/Scala/Erlang,靜態語言可以嘗試Java/Golang。數據的統計分析可以幫助妳理解R語言。如果妳想從不同的角度做後端業務,可以嘗試Node.js和Nginx_Lua結合上面提到的Nginx。學習不同的語言主要是為了提高自己的視野和解決問題方法的差異,例如進程/線程的解散和輕量級協調;例如,在跨機器通信場景中,Erlang的解決方案出奇地簡單;例如,在不選擇C/C++的情況下,還有類似的高效Erlang/Golang可用等。主要是提高視力。?
9.妳在其他專業領域學習嗎?
在這個階段,除了基本的LNMP技能外,我們將考慮學習其他領域的壹些知識,這些都是可能的,取決於個人興趣和長期目標。目前可供選擇的領域很多,比如雲計算(分布式存儲、分布式計算、虛擬機等。)、機器學習(數據挖掘、模式識別等。、應用於統計和個性化推薦)、自然語言處理(中文分詞等。)、搜索引擎技術、圖形圖像、語音識別等。除了這些高大上的專業之外,我們也有很多可以學習工科的地方,比如高性能系統、移動開發(Android/IOS)、計算機安全、嵌入式系統、硬件等方向。?
10.
系統設計在第二階段的基礎上,可以應用掌握的經驗和技能設計相對復雜的中大型系統,並能解決線上各種復雜系統的大部分問題,完成壹個瀏覽器-》;CDN-》;負載平衡-》;接入層-》;nginx+PHP-& gt;服務緩存-& gt;數據庫-& gt;各種復雜的後端RPC交互(存儲後端、邏輯後端、反作弊後端、外部服務)-》;後端醬紫的業務更復雜;它可以支持每天幾千萬到幾億流量的網站的正常開發和維護。