当前位置: 首页 > 后端技术 > PHP

PHP程序员学习路线

时间:2023-03-29 21:11:51 PHP

第一阶段:基础阶段(基础PHP程序员)重点:熟练掌握LNMP(核心是安装配置的基本操作)目标:能够完成基本的LNMP系统安装、简单的配置和维护;能够进行简单系统的基础PHP开发;能够支持PHP中型系统中某些PHP功能模块的开发。时间:完成这个阶段的时间因人而异。有的,有的半年、一年,长得快,长得慢,要两三年。1、Linux基本命令、操作、启动、基本服务配置(包括rpm安装文件、各种服务配置等);会写简单的shell脚本和awk/sed脚本命令等。2.Nginx会安装配置nginx+php,知道基本的nginx核心配置选项,知道server/fastcgi_pass/access_log等基本配置,目标是使nginx+php_fpm顺利运行。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环境,快速完成常规配置;能够跟踪并解决开发和线上环境中遇到的大部分问题;能够独立承担中型系统的架构和开发;能够承担一定的大型系统中的模块开发工作。在第一阶段的基础上,Linux可以流畅地使用Shell脚本完成很多自动化任务;awk/sed/perl也运行良好,可以完成大量的文本处理和数据统计;基本上它可以安装大部分非特殊的Linux程序(包括各种库、包、第三方依赖等,如MongoDB/Redis/Sphinx/Luncene/SVN);了解基本的Linux服务,知道如何查看Linux性能指标数据,知道Linux下基本的Issue跟踪等。在第一阶段的基础上,Nginx了解更复杂的Nginx配置;包括多核配置、事件、proxy_pass、sendfile/tcp_*配置,了解相关配置和超时等性能影响;知道nginx除了web服务器、反向静态服务器等配置外,还可以承接代理服务器;了解基本的nginx配置调优;知道如何配置权限,编译一个nginx扩展到nginx;知道nginx的基本运行原理(master/worker机制,epoll),知道为什么nginx性能比apache性能好等知识。MySQL/MongoDB在第一阶段的基础上掌握了很多MySQL开发的小技巧,包括常规的SQL优化(groupby/orderby/rand优化等);除了可以搭建MySQL,还可以冷热备份MySQL数据,还知道影响innodb/myisam性能的配置选项(如key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit等),以及也知道有多少值适合这些选项配置;也知道一些特殊的配置选项,比如如何搭建mysqlmaster-slave同步环境,知道各个binlog_format的区别;了解MySQL的性能跟踪,包括slow_log/explain等,了解索引建立和处理的基础知识;从原理上理解基本的MySQL架构(Server+存储引擎),知道基本的InnoDB/MyISAM索引存储结构不同(聚集索引,B树);了解基本的InnoDB事务处理机制;了解大多数MySQL异常的处理方案(或知道在哪里可以找到处理方案)。如果条件允许,建议学习一下NoSQL代表的MongoDB数据库。顺便对比一下和MySQL的区别。同事们可以在合适的应用场景中安全谨慎的使用MongoDB,了解PHP和MongoDB的基本联合开发。Redis/Memcached在大多数中型系统中肯定会涉及到缓存处理,所以必须了解基本的缓存;了解Memcached和Redis的异同和应用场景,能够独立安装Redis/Memcached,了解Memcahed的一些基本特性和局限性,例如最大值,了解PHP的组合及其使用;Redis了解基本工作原理和使用,了解常规数据类型,知道什么类型在哪些场景下使用,了解Redis事务等等。原理部分可以大致了解Memcached的内存结构(slab机制),redis了解常用数据类型(SDS/链表/SkipList/HashTable)的底层存储结构等就好了。除了PHP第一阶段的能力外,在安装配置方面可以随意安装PHP和各种第三方扩展;了解php-fpm的大部分配置选项和含义(比如影响性能的max_requests/max_children/request_terminate_timeout配置),了解mod_php/fastcgi的区别;已经精通PHP的各种基础技术,包括各种深入PHP,包括深入理解PHP的面向对象/SPL/反射等语法层面的特殊功能框架方面,我看过at的代码至少一种常规的PHPMVC框架,了解基本PHP框架的内部实现机制和设计思想;已经能够在PHP开发中使用常规的设计模式进行应用程序开发(抽象工厂/单Example/Observer/CommandChain/Strategy/Adapter等模式);建议开发自己的PHPMVC框架,充分解放开发,让自己深刻理解MVC模式,让自己在业务项目开发中快速升级;熟悉PHP各种代码优化方法,熟悉大部分PHP安全问题的解决方案;熟悉PHP执行的基本机制(Zendengine/extensionbasicworkingmechanism)。C/C++开始涉猎某门C/C++语言,能够编写基本的C/C++代码,熟悉基本的C/C++语法(指针、数组操作、字符串、常规标准API)和数据结构(链表、树,对Linux下的C语言开发有一定的了解,能编写简单的makefile文件,能使用简单的GCC/GDB程序编译和简单的调试工作;基本的网络编程我有一个大概的了解。在第一阶段的基础上,前端熟悉基本的HTTP协议(协议代码200/300/400/500,基本的HTTP交互头);如果条件允许,可以写一个稍微优雅一点的深入HTML+CSS+JavaScript,或者可以粗略的使用一些前端框架(jQuery/YUI/ExtJS/RequireJS/BootStrap之类);如果条件允许,可以深入学习JavaScript编程,比如闭包机制,DOM处理;如果你想更深入,你可以阅读jQuery供深入研究的源代码。(本项目不重点学习,除非你对前端感兴趣)。系统设计可以设计大部分中型系统的网站架构、数据库、基本PHP框架选择;性能测试、故障排除等;可以完成类似:浏览器->CDN(Squid)->Nginx+PHP->缓存->数据库结构网站的基本设计、开发和维护;日均百万级到千万级流量的基础网站的开发和维护;第三阶段:高级阶段(高级PHP程序员)或者领域有深度学习。(深度开发)目标:除完成基本的PHP业务开发外,还能解决最深层次、最复杂的技术问题,能够独立设计完成中大型系统设计开发工作;能独立掌握一定的技术方向,在这方面比较专业。(比如对MySQL、Nginx、PHP、Redis等任何方向的深入研究)除了linux的第二阶段能力,除了linux下的日常操作和性能监控跟踪,还可以还使用许多高级和复杂的命令来完成工作(观看/tcpdump/starce/ldd/ar等);在shell脚本方面,已经能够编写更复杂的shell脚本(500多行),协助完成包括备份、自动处理、监控等在内的众多shell;对于awk/sed/perl等应用程序已经熟练,可以自由操作、控制、处理文本统计和分析各种复杂格式的数据;对Linux的内部机制有一定了解,对内核模块加载、启动错误处理等有基本处理;也了解了一些其他相关的东西,比如NFS,磁盘管理等;Nginx在第二阶段的基础上已经可以熟练操作Nginx,可以对Nginx进行更深入的运维工作,比如监控和性能优化,复杂问题处理等;根据个人兴趣,可以考虑更多的方面来重点深入研究Nginx的工作原理,主要是在阅读源码的开始,比如具体的master/worker工作机制,Nginx内部的事件处理,内存管理等;同时可以学习Nginx扩展的开发,可以自定义一些自己的私有扩展;同时,可以对Nginx+Lua有一定的了解,看看能不能有更好的模型组合应用;这个阶段的要求是对Nginx原理有深入的了解,可以考虑成为Nginx方向的深入专业人士。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等),connectionpool软件选择应用,用于show*(showstatus/showprofile)操作语句,可以完成大部分的性能问题追踪;深入熟悉MySQL备份技术,包括容灾、深入理解Binlog、冷热备份、多IDC备份等;在MySQL的原理方面有了更多的了解,比如开始阅读一些MySQL工作机制的源码,比如学习主从同步(复制)技术的源码,或者学习源码某存储引擎(MyISAM/Innodb/TokuDB)等的学习理解,如果条件允许,可以参考CSV引擎开发自己的简单存储引擎来保存一些数据,增强对MySQL的理解;在这个过程中,如果有兴趣,也可以考虑往DBA方向发展。比如MongoDB层面,可以在少写多读的时候开始在线应用MongoDB,或者做一些在线的数据分析处理操作。具体的场景可以根据工作而定,但核心是更好地理解RMDBS。对于与NoSQL不同场景下的应用,如果条件允许或者兴趣允许,可以开始深入了解MongoDB的工作机制。在第二阶段的基础上,可以更深入的应用和学习Redis/Memcached。因为Memcached并不是特别复杂,建议阅读源码,尤其是内存管理部分,方便深入理解;对于Redis部分,可以做更复杂的数据结构应用(zset用于排名排序操作/事务处理用于保证Atomicity用于秒杀场景的应用);学习涉及aof等同步机制的应用,设计高可用的Redis应用架构和集群;建议深入研究Redis的源码,把第二阶段积累的知识应用起来。特别是包括核心事件管理、内存管理、内部核心数据结构等内容都可以阅读,充分学习和理解。如果兴趣允许,你可以成为一个非常专业的Redis用户。作为PHP的基础核心技能,需要在第二阶段的基础上有更深入的学习和应用。从上面的基础代码应用,可以解决95%的PHP开发中遇到的问题,了解大部分的PHP技巧;可以在一天之内快速上手大部分PHP框架,了解各个主流PHP框架的优缺点,可以在项目开发中快速方便的进行技术选型;在配置方面,除了第二阶段的知识,你还会知道一些更远程的配置选项(phpauto_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/streamprocessing),阅读过基本的PHP内核源码(或阅读过相关文章),熟悉PHP内部机制熟悉大部分核心数据结构的实现(基本类型/数组/Object),并对核心基础设施(zval/hashtable/gc)有深入的了解;能够进行基本的PHP扩展开发,了解一些中高级扩展开发知识(minit/rinit等),熟悉php与apache/nginx(mod_php/fastcgi)的不同通信交互方式的细节;除了开发PHP扩展之外,你还可以考虑学习开发Zend扩展,以便从更底层理解PHP。基于第二阶段,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等)leader-follow/master-worker等);了解C/C++后端Server开发中的大部分问题(内存管理、日志打印、高并发、前后端通信协议、服务监控),了解各个后端服务的RPC通信问题(struct/http/thirft/protobuf等);能较熟练地使用GCC、GDB开发、编译、调试程序,在线程序内核掉线后能快速追踪并解决问题;在通用模块开发方面,可以积累或开发一些常用的工具或库(如异步网络框架、日志库、内存池、线程池等),但开发后是否应用需要慎重,以免大家埋坑追虫。前端对HTTP协议有深入的了解(包括各种详细协议的特殊协议代码及其背后的原因,比如302是缓存静态文件,502是php挂在nginx后面等);如果大家有兴趣了解这方面的内容,可以再深入一些。表现形式就是你可以自己开发一些类似jQuery的前端框架,或者开发一个富文本编辑器之类的小测试来测试你的JavaScript技能。其他领域的语言学习,在基本的PHP/C/C++语言上都有基本的积累。建议大家现阶段可以尝试学习不同的编程语言,根据个人兴趣爱好。脚本语言可以学习Python/Ruby等。编程语言可以试试Lisp/Haskell/Scala/Erlang,静态语言可以试试Java/Golang,统计分析可以试试R语言。如果想换个角度做后端业务,可以试试Node.js或者上面说的Nginx_Lua结合Nginx。学习不同的语言主要是为了提高自己的视野和解决问题方法的差异。比如你会明白,除了进程/线程,还有轻量级的协程;例如,在跨机通信的情况下,Erlang的解决方案出奇的简单;例如如果你不想选择C/C++,有类似高效的Erlang/Golang可用等;主要是改善视力。在学习其他专业方向的这个阶段,除了基本的LNMP技能外,还会考虑学习其他领域的知识。这些都是可以的,看个人兴趣和长期目标。目前可以选择的领域很多,如云计算(分布式存储、分布式计算、虚拟机等)、机器学习(数据挖掘、模式识别等,应用于统计、个性化推荐)、自然语言处理(中文分词等)、搜索引擎技术、图形图像、语音识别等。除了这些高端的,还有很多面向工程的地方可以学习,比如高性能系统、移动开发(Android/IOS)、计算机安全、嵌入式系统、硬件等方向。系统设计在第二阶段的基础上,系统设计可以利用自己掌握的经验和技巧,设计出相对复杂的中大型系统,可以在线解决各种复杂系统的大部分问题,完成类似浏览器->CDN->负载均衡->接入层->Nginx+PHP->业务缓存->数据库->各种复杂后端(存储后端、逻辑后端、反作弊后端、外部服务)的RPC交互->更新多后端复杂业务;可以支持每天几千万到上亿流量网站的正常开发和维护。