php程序员技术发展php技术开发经理,php性能瓶颈怎么解决
PHP作为Web开发中使用最广泛的语言之一,拥有大量的粉丝,那么你是一个优秀的程序员吗?在进行自我修炼的同时,你有没有想过面对各种问题,我该如何突破自己的瓶颈,才能更好的发展?
PHP工程师面临成长瓶颈。
首先明确,这里的PHP工程师指的是以PHP为主的Web系统开发,从未从事过其语言的工作。工作经验3~4年左右,常见的Web系统(几百万次访问,几千个数据或者业务逻辑不是特别复杂)基本得心应手,没有问题。但是它们看起来会像这样:
不使用PHP以外的其他语言,可能会点shell脚本。
PHP掌握不好(很多PHP手册都没看过,除了库)。
知识面窄(面对需求,除了用PHP和MySQL,不知道其他解决方案)。
PHP代码是面向过程的,以为面向对象的实现太复杂理解不了。
这些PHPer在遇到要求高性能、处理高并发、大数据量(系统需要解决多领域业务的问题)的复杂项目或业务逻辑时,缺乏思路。无法分析问题的本质,技术判断力差,能迅速为问题找到临时解决方案。但是,在不断的治标不治本中,制度和自身会一步步崩溃。那么如何提升自己呢?你如何挑战一个更难的系统?
更高的挑战在哪里?
我根据自己的经验,列举一些具体的挑战,让大家先有个感性认识。
高性能系统面临哪些挑战?
如何选择Web服务器?你想使用快速cgi模式吗?
是否要使用反向代理服务?选择全内存缓存还是硬盘缓存?
需要负载均衡吗?是基于应用层还是网络层?如何保证高可靠性?
你的PHP代码性能如何?使用优化工具后呢?性能瓶颈在哪里?需要写C的扩展吗?
用户访问有什么特点?你读的多还是写的多?需要读写分离吗?
数据是如何存储的?写作速度和阅读速度是多少?数据访问速读如何变化?
如何使用缓存?如何考虑作废?如何保证数据的一致性?
高复杂性系统的挑战是什么?
你能识别业务对应的领域吗?是一个还是多个?
能否合理抽象业务,以较小的成本实现业务规则的改变?
能否保证数据的一致性和安全性?
你支持面向对象分析和设计的方法吗?
你可以肯定的回答这里列出的所有问题,这说明技术上你基本上可以成为一名架构师。你怎么还不回答?你需要在以下几个方向加强。
如何改善和突破瓶颈
你怎么还不回答?您需要在以下几个方面加强:
分析你所使用的技术的原理及其背后的机理,从而提高你的技术判断和你技术方案选择的正确性;
学习大学里的重要知识,操作系统原理,数据结构,算法。知道自己以前是为了考试而学习,现在需要为了自己而学习,让自己知道为什么;
重新开始学习C语言,虽然你在大学已经学过了。这不仅是因为你可能需要编写PHP扩展,还因为,在C的应用中,有一个环境总是关心性能、内存控制、变量生命周期、数据结构和算法;
学习面向对象的分析与设计,这是解决复杂问题的有效方法。学习抽象是解决复杂问题的唯一途径。
如何有效学习是个大问题。“以架构为中心,用例驱动,迭代开发”。借用这个思路,有效的学习方法可以表述为:原则、模型或机制为中心、任务驱动、迭代学习。有点抽象。举个例子说明怎么学。
目的:了解如何提高加工性能。
迭代驱动的任务:通过IP找到你的区域。这是Web应用的常见任务,IP数据库大概10万条记录。
第一次迭代:在不考虑性能的情况下实现函数(通过PHP)
因为不能直接通过KEY(IP)找到区域,所以直接放入数据或者通过关联数组的简单方法是行不通的。这个想法是首先对数据进行排序,然后进行搜索:
如何通过IP找到?对于有序数据,二分搜索法是最快的。
怎么排序?当然,使用库函数排序也是可以的,但既然是学习,不如自己实现快速排序。
学习目标:排序算法、搜索算法
PHPer的数据结构和算法基础比较差,平时没有这个任务,也不自学,所以缺乏这方面的知识。但是编程解决的问题,最终还是要归结到数据结构和操作这个数据结构的算法上。如果把数据结构算法用在长在信中,遇到问题就能清晰的识别出内在的结构,解决方案自然也就应运而生了。
第二次迭代:优化数据加载和排序。
如果做第一步的话,基本上是不可用的,因为每次都需要加载和排序数据,耗时太多。解决方案是加载和排序数据一次,并把它放在每个PHP进程都可以访问的地方。放在Memcache里,这是一个很容易想到的问题。其实放在共享内存更快(EA等加速器支持),因为memcache的网络操作更多。数据是作为一个整体放入共享内存还是分块放入?如何测试性能?如何分析瓶颈(xdebug)?在这些问题的驱动下,你会学到。
学习目标:检测、定位和优化PHP性能的方法;PHP实现结构对性能的影响。
第三次迭代:编写PHP的扩展
性能还是上不去,只好进入C/C的世界了,不过,从现在开始,你不仅是PHPer,还是服务器端的全能工程师。当然,这对于那些没有做过C/C的同学来说,是一个巨大的挑战。
学习目标:学习C/C,编写PHP扩展。
如何确定需要学习的机制和原理?驾驶学习任务怎么找?我不知道我需要学什么。以上两个问题我该怎么回答?从这项技术的定位中,找出需要学习的重点,即它是怎么做到的(机理),为什么能做到。列出这项技术最常见的应用,作为一项学习任务,从简单到困难的实践。
如果需要学习JavaScript,对HTML和CSS有一些感性认识。首先,JavaScript是Web领域的动态语言,主要解决网页的动态交互。需要学习的要点如下:
JavaScript如何与HTML交互(机制)
JavaScript的动态特性在哪里,和其他动态语言有什么不同?(语言模型)
如果你是完全自学的,要找到学习的重点(机理、模型、原理)并设定学习任务,真的不是那么容易。如果找一个有经验的人来指导你,或者加入一个学习团队,学习速度确实会大大提高。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。