仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 808|回复: 18
打印 上一主题 下一主题

[学习教程] PHP编程:深度切磋PHP之功能

[复制链接]
跳转到指定楼层
楼主
发表于 2015-2-3 23:30:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
从刚开始练习的PHP基础语法练习,到PHP语言在WEB中的应用,再到实际的项目开发,如留言版,相册系统,中小型公司网站系统,以及期间做过的有关团队合作的小游戏,让我受益匪浅,学到了很多。     
  1.缘起
  关于PHP,良多人的直不雅感到是PHP是一种天真的剧本言语,库类丰厚,利用复杂,平安,十分合适WEB开辟,但功能低下。PHP的功能是不是真的就 好像人人的感到一样的差呢?本文就是环绕这么一个话题来停止切磋的。从源码、使用场景、基准功能、对照剖析等几个方面深切剖析PHP之功能成绩,并经由过程真 实的数据来讲话。
  2.从道理剖析PHP功能
  从道理剖析PHP的功能,次要从以下几个方面:内存办理、变量、函数、运转机制来停止剖析。
  2.1内存办理
  相似Nginx的内存办理体例,PHP在外部也是基于内存池,而且引入内存池的性命周期概念。在内存池方面,PHP对PHP剧本和扩大的一切内存相干操作都停止了托管。对大内存和小内存的办理采取了分歧的完成体例和优化,详细可以参考以下文档:https://wiki.php.net/internals/zend_mm。在内存分派和收受接管的性命周期内,PHP采取一次初始化请求+静态扩容+内存标识收受接管机制,而且在每次恳求停止后直接对内存池停止从头mask。
  2.2变量
  总所周知,PHP是一种弱变量类型的言语,所以在PHP外部,一切的PHP变量都对应成一品种型Zval,个中详细界说以下:
  

  图一PHP变量
  在变量方面,PHP做了大批的优化任务,好比说Reference counting和copy on writer机制。如许可以包管内存利用上的优化,而且削减内存拷贝次数(请参考http://blog.xiuwz.com/2011/11/09 /php-using-internal-zval/)。在数组方面,PHP外部采取高效的hashtable来完成。
  2.3函数
  在PHP外部,一切的PHP函数都反转展转化成外部的一个函数指针。好比说扩大中函数
复制代码

    1. ZEND_FUNCTION ( my_function );//相似
      function my_function(){}  
    复制代码

  在外部睁开后就会是一个函数
复制代码

    1. void zif_my_function ( INTERNAL_FUNCTION_PARAMETERS );  
    复制代码

  • void zif_my_function(   
  • int ht,   
  • zval * return_value,   
  • zval * this_ptr,   
  • int return_value_used,   
  • zend_executor_globals * executor_globals   
  • );   
  •    
  从这个角度来看,PHP函数在外部也是对应一个函数指针。
  2.4运转机制
  在话说PHP功能的时分,良多人城市说“C/C++是编译型,JAVA是半编译型,PHP是注释型”。也就是说PHP是先静态解析再代码运转的,所以从这个角度来看,PHP功能必定很差。
  切实其实,从PHP剧本运转来输入,切实其实是一个静态解析再代码运转的进程。详细来讲,PHP剧本的运转机制以下图所示:
  

  图二 PHP运转机制
  PHP的运转阶段也分红三个阶段:


  • Parse。语法剖析阶段。
  • Compile。编译产出opcode两头码。
  • Execute。运转,静态运转停止输入。
  所以说,在PHP外部,自己也是存在编译的进程。而且据此发生了大批的opcode cache东西,好比说apc、eacc、xcache等等。这些opcode cache在临盆情况根基上在标配。基于opcode cache,能到做到“PHP剧本编译一次,屡次运转”的后果。从这点上,PHP就和JAVA的半编译机制十分相似。
  所以,从运转机制下去看,PHP的运转形式和JAVA长短常相似的,都是先发生两头码,然后运转在分歧虚拟机上。
  2.5静态运转
  从下面的几个剖析来看,PHP在内存办理、变量、函数、运转机制等几个方面都做了大批的任务,所以从道理来看,PHP不该该存在功能成绩,功能最少也应当和Java对照接近。
  这个时分就不能不谈PHP静态言语的特征所带来的功能成绩了,因为PHP是静态运转时,所以一切的变量、函数、对象挪用、感化域完成等等都是在履行 阶段中才肯定的。这个从基本上决意了PHP功能中很难改动的一些器材:在C/C++等可以在静态编译阶段肯定的变量、函数,在PHP中需求在静态运转中确 定,也就决意了PHP两头码不克不及直接运转而需求运转在Zend Engine上。
  说到PHP变量的详细完成,又不能不说一个器材了:Hashtable。Hashtable可以说在PHP魂灵之一,在PHP外部普遍用到,包括变量符号栈、函数符号栈等等都是基于hashtable的。
  以PHP变量为例来讲明下PHP的静态运转特色,好比说代码:
复制代码

    1. <?php
    复制代码

  • $var = “hello, blog.xiuwz.com”;   
  • ?>   
  •    
  该代码的履行了局就是在变量符号栈(是一个hashtable)中新增一个项
  

  当要利用到该变量时分,就去变量合适栈中去查找(也就是变量挪用对出了一个hash查找的进程)。
  一样关于函数挪用也根基上相似有一个函数符号栈(hashtable)。
  其实关于静态运转的变量查找特色,在PHP的运转机制中也能看出一些。PHP代码经由过程注释、编译后的流程下图:
  

  图3 PHP运转实例
  从上图可以看出,PHP代码在compile以后,产出的了类符号表、函数符号表、和OPCODE。在真正履行的时分,zend Engine会依据op code去对应的符号表中停止查找,处置。
  从某种水平上,在这类成绩的上,很难找到处理计划。由于这是因为PHP言语的静态特征所决意的。然而在国际外也有很多的人在寻觅处理计划。由于经由过程如许,可以从基本上完整的优化PHP。典范的列子有facebook的hiphop(https://github.com/facebook/hiphop-php)。
  2.6结论
  从下面剖析来看,在基本的内存办理、变量、函数、运转机制方面,PHP自己其实不会存在分明的功能差别,但因为PHP的静态运转特征,决意了PHP和 其他的编译型言语比拟,一切的变量查找、函数运转等等城市多一些hash查找的CPU开支和额定的内存开支,至于这类开支详细有多大,可以经由过程后续的基准 功能和对照剖析得出。
  因而,也能够大体看出PHP不太合适的一些场景:大批盘算性义务、大数据量的运算、内存请求很严厉的使用场景。假如要完成这些功效,也建议经由过程扩大的体例完成,然后再供应钩子函数给PHP挪用。如许可以减低外部盘算的变量、函数等系列开支。
  3.基准功能
  关于PHP基准功能,今朝短少尺度的数据。大多半同窗都存在理性的熟悉,有人以为800QPS就是PHP的极限了。另外,关于框架的功能和框架对功能的影响很没有呼应的威望数字。
  本章节的目标是给出一个基准的参考功能目标,经由过程数据给人人一个直不雅的懂得。
  详细的基准功能有以下几个方面:
  1.裸PHP功能。完成根基的功效。
  2.裸框架的功能。只做最复杂的路由分发,只走通中心功效。
  3.尺度模块的基准功能。所谓尺度模块的基准功能,是指一个具有完全办事模块功效的基准功能。
  3.1情况申明
  测试情况:
   
  Uname -a
  Linux db-forum-test17.db01.百度.com 2.6.9_5-7-0-0 #1 SMP Wed Aug 12 17:35:51 CST 2009 x86_64 x86_64 x86_64 GNU/Linux
  Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
  8  Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz
  软件相干:
   
  Nginx:
  nginx version: nginx/0.8.54  built by gcc 3.4.5 20051201 (Red Hat 3.4.5-2)
  Php5:(采取php-fpm)
  PHP 5.2.8 (cli) (built: Mar  6 2011 17:16:18)
  Copyright (c) 1997-2008 The PHP Group
  Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
  with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
  bingo2:
  PHP框架。
  其他申明:
  方针机械的安排体例:
剧本。
  测试压力机械和方针机械自力安排。
  3.2裸PHP功能
  最复杂的PHP剧本。
复制代码

    1. <?php
    复制代码

  • require_once ‘./actions/indexAction.php’;   
  • $objAction = new indexAction();   
  • $objAction->init();   
  • $objAction->execute();   
  • ?>  
  • Acitons/indexAction.php外面的代码以下   
  • <?php  
  • class indexAction   
  • {   
  • public function execute()   
  • {   
  • echo ‘hello, world!’;   
  • }   
  • }   
  • ?>   
  •    
  经由过程压力东西测试了局以下:
  

  3.3裸PHP框架功能
  为了和3.2的对照,基于bingo2框架完成了相似的功效。代码以下
复制代码

    1. <?php
    复制代码

  • require_once ‘Bingo/Controller/Front.php’;   
  • $objFrontController = Bingo_Controller_Front::getInstance(array(   
  • ‘actionDir’ => ‘./actions’,   
  • ));   
  • $objFrontController->dispatch();   
  压力测试了局以下:
  

  从该测试了局可以看出:框架固然有必定的损耗,但对全体的功能来讲影响长短常小的。
  3.4尺度PHP模块的基准功能
  所谓尺度PHP模块,是指一个PHP模块所必需要详细的根基功效:
  路由分发。
  主动加载。
  LOG初始化&Notice日记打印。所以的UI恳求都一条尺度的日记。


  • 毛病处置。
  • 工夫校订。
  • 主动盘算每一个阶段耗时开支。
  • 编码辨认&编码转化。
  • 尺度设置装备摆设文件的解析和挪用
  采取bingo2的代码主动生成东西发生尺度的测试PHP模块:test。
  测试了局以下:
  

  3.5结论
  从测试数据的结论来看,PHP自己的功能仍是可以的。基准功能完整可以到达几千乃至上W的QPS。至于为何在大多半的PHP模块中体现欠安,其实 这个时分更应当去找出体系的瓶颈点,而是复杂的说OK,PHP不可,那咱们换C来弄吧。(下一个章节,会经由过程一些例子来对照,采取C来处置不见得有出格的 优势)
  经由过程基准数据,可以得出以下几个详细的结论:
  1.PHP自己功能也很不错。复杂功效下可以到达5000QPS,极限也能过W。
  2.PHP框架自己对功能影响十分无限。特别是在有必定营业逻辑和数据交互的情形下,几近可以疏忽。
  3.一个尺度的PHP模块,基准功能可以到达2000QPS(80 cpu idle)。
  4.对照剖析
  良多时分,人人发明PHP模块功能不可的时分,就来一句“ok,咱们采取C重写吧”。在公司内,采取C/C++来写营业逻辑模块的景象各处都有,在前几年乃至几近全体都是采取C来写。那时分人人写的真是一个疾苦:调试难、急迅不要谈。
  文章出自:百度-tech.com
一些真正的强人总会搞出新玩意来丢给你,你不学就落后了,也印证了前人的经验,果然是学无止境啊!
飘灵儿 该用户已被删除
沙发
发表于 2015-2-4 00:06:12 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
深爱那片海 该用户已被删除
板凳
发表于 2015-2-9 07:54:06 | 只看该作者
爱上php,他也会爱上你。
若天明 该用户已被删除
地板
发表于 2015-3-8 20:43:18 | 只看该作者
实践是检验自己会不会的真理。
爱飞 该用户已被删除
5#
发表于 2015-3-9 22:51:21 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
再见西城 该用户已被删除
6#
发表于 2015-3-17 02:11:23 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
兰色精灵 该用户已被删除
7#
发表于 2015-3-18 03:43:04 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
海妖 该用户已被删除
8#
发表于 2015-3-25 11:10:20 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
山那边是海 该用户已被删除
9#
发表于 2015-3-27 03:10:27 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
金色的骷髅 该用户已被删除
10#
发表于 2015-4-4 05:18:44 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
活着的死人 该用户已被删除
11#
发表于 2015-4-6 07:10:15 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
不帅 该用户已被删除
12#
发表于 2015-4-7 01:08:27 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
透明 该用户已被删除
13#
发表于 2015-4-7 19:02:57 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
变相怪杰 该用户已被删除
14#
发表于 2015-4-10 07:16:16 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
老尸 该用户已被删除
15#
发表于 2015-5-10 20:35:37 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
若相依 该用户已被删除
16#
发表于 2015-5-11 01:30:08 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
因胸联盟 该用户已被删除
17#
发表于 2015-6-4 00:14:52 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
蒙在股里 该用户已被删除
18#
发表于 2015-6-12 19:53:00 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
莫相离 该用户已被删除
19#
发表于 2015-6-25 21:03:51 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-21 03:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表