中级PHP程序员必备技能:Linux Shell脚本与Nginx高级配置详解
中级 PHP 程序员

1.Linux可以流畅地使用Shell脚本完成很多自动化任务; awk/sed/perl 也运行良好,可以完成大量的文本处理和数据统计。它基本上可以安装大多数非特殊的Linux程序(包括各种库、包、第三方依赖项等,例如MongoDB/Redis/Sphinx/Luncene/SVN)。 ETC。);了解基本的Linux服务、了解如何查看Linux性能指标数据、了解Linux下的基本问题跟踪等。
2.Nginx:
在第一阶段的基础上,了解更复杂的Nginx配置;包括多核配置、事件、proxy_pass、sendfile/tcp_*配置、了解超时等相关配置和性能影响;要知道nginx不仅是web服务器,还可以负责代理服务器、反向静态服务器等的配置;了解基本的 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基本架构(服务器+存储引擎),了解基本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、系统设计:
能够设计大多数中型系统的网站架构、数据库以及基本的PHP框架选择;进行性能测试和故障排除等;能够完成类似任务:浏览器->CDN(Squid)->Nginx+PHP->缓存->数据库结构网站基础设计、开发和维护;能够支持每天数百万至数千万访问量的基础网站的开发和维护;
高级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的工作原理,主要从阅读源码开始,比如具体的master/worker工作机制、Nginx内部事件处理、内存管理, ETC。;同时可以学习Nginx扩展的开发,可以定制一些自己的私有扩展;同时可以对Nginx+Lua有一定程度的了解,看看是否可以组合应用更好的模式;此阶段的要求是深入了解Nginx原理,可以考虑成为一名Nginx专业人士。
3.MySQL/MongoDB:
在第二阶段的基础上,就MySQL应用而言,除了前面的基础SQL优化外,还可以完成一些复杂的操作,比如大批量数据的导入导出、在线大批量数据的表结构改变等。数据,或者添加、删除索引字段等高风险操作;除了安装和配置之外,它已经能够处理更复杂的M ySQL问题,比如追踪各种问题、解决主从同步延迟问题、跨机房数据同步解决方案、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扩展配置、apc扩展配置保护中的apc.mmap_file_mask/apc.slam_defense/apc.file_update_p等);对PHP的工作机制有一定的了解,包括php-fpm的工作机制(如不同配置的机器上php-fpm启用的进程数的计算和原理),对PHP有基本的熟悉zend引擎(vm/gc/stream处理),已阅读基本的PHP内核源代码(或阅读相关文章),并了解PHP内部机制的大部分核心数据结构(基本类型/数组/对象)实现,有深入的学习和理解核心基础设施(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++后端服务器开发中的大部分问题(内存管理、日志打印、高并发、前后端通信协议、服务监控),了解了解各种后端服务的RPC通信问题(struct/http/thirft/protobuf 等);更加熟悉使用GCC和GDB开发编译和调试程序,在线程序出核后能够快速跟踪和解决问题;开发通用模块 另一方面,你可以积累或开发一些通用的工具或库(如异步网络框架、日志库、内存池、线程池等),但要小心开发后是否应用到避免追逐错误;
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 -> 业务缓存 -> 数据库 -> 各种复杂的后端RPC交互(存储后端、逻辑后端、防作弊后端、外部服务) -> 更复杂的后端业务;能够支撑每天几千万到上亿访问量的网站的正常开发和维护。
下图对其进行了详细的总结,从基础到高级都有相应的介绍。您可以保存图片并仔细研究。