之前做过.net,java开发,也写过几个php的网站,似乎3种主要编程语言都接触了。但是越来越觉得自己对编程的整个流程缺乏一个整体的认识,尤其是底层的机制。譬如网络编程,编译原理,服务器端,数据库存储引擎原理等。于是看了一些书,比较经典的有apue,unp,tcp/ip,nginx,mysql的innodb存储引擎,深入理解jvm。渐渐发现无论用什么语言做开发,背后都有linux,shell,c/c++,nginx服务器,mysql的身影。也许只有掌握了这些核心的原理知识,一个程序员才具有核心竞争力。
bat的后端部分都是离不开这些核心技术的,只是前端(业务逻辑层)会有差别。譬如淘宝主要采用java,百度主要采用php。而腾讯是个工具控集团,主要采用c/c++技术。腾讯的主要的产品都是windows下的各种客户端(qq,输入法,music...最重要的是游戏)以及服务器端。相对而言,web产品是比较少的(qq空间,朋友网等),这些web产品以及比较成熟了,只是偶尔会做一下改进而已。除非有新的产品出现,不然不会有大量的人才需求。
虽然目前机器学习,大数据挖掘领域人才需求貌似比较旺盛,但是相关的技术还是要建立在linux,jvm上面。某些公司对java人才的需求会进一步增长。
既然了解了c语言编译以及连接的过程,java的jvm下的运行机制,突然好奇php的运行流程,机制和原理也。找了几篇博客,大概了解了一下。先放到下面:
php底层工作原理
简介
先看看下面这个过程:
我们从未手动开启过php的相关进程,它是随着apache的启动而运行的;php通过mod_php5.so模块和apache相连(具体说来是sapi,即服务器应用程序编程接口);php总共有三个模块:内核、zend引擎、以及扩展层;php内核用来处理请求、文件流、错误处理等相关操作;zend引擎(ze)用以将源文件转换成机器语言,然后在虚拟机上运行它;扩展层是一组函数、类库和流,php使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接mysql数据库;当ze执行程序时可能会需要连接若干扩展,这时ze将控制权交给扩展,等处理完特定任务后再返还;最后,ze将程序运行结果返回给php内核,它再将结果传送给sapi层,最终输出到浏览器上。深入探讨
等等,没有这么简单。以上过程只是个简略版,让我们再深入挖掘一下,看看幕后还发生了些什么。
apache启动后,php解释程序也随之启动;php的启动过程有两步;第一步是初始化一些环境变量,这将在整个sapi生命周期中发生作用;第二步是生成只针对当前请求的一些变量设置。php启动第一步
不清楚什么第一第二步是什么?别担心,我们接下来详细讨论一下。让我们先看看第一步,也是最主要的一步。要记住的是,第一步的操作在任何请求到达之前就发生了。
启动apache后,php解释程序也随之启动;php调用各个扩展的minit方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧;minit的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。一个典型的minit方法如下:
php_minit_function(extension_name){
/* initialize functions, classes etc */
}
php启动第二步
当一个页面请求发生时,sapi层将控制权交给php层。于是php设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值。php调用各个模块的rinit方法,即“请求初始化”。一个经典的例子是session模块的rinit,如果在php.ini中启用了session模块,那在调用该模块的rinit时就会初始化$_session变量,并将相关内容读入;rinit方法可以看作是一个准备过程,在程序执行之间就会自动启动。一个典型的rinit方法如下:
php_rinit_function(extension_name) {
/* initialize session variables, pre-populate variables, redefine global variables etc */
}
php关闭第一步
如同php启动一样,php的关闭也分两步:
一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),php就会启动清理程序。它会按顺序调用各个模块的rshutdown方法。rshutdown用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。一个典型的rshutdown方法如下:
php_rshutdown_function(extension_name) {
/* do memory management, unset all variables used in the last php call etc */
}
php关闭第二步
最后,所有的请求都已处理完毕,sapi也准备关闭了,php开始执行第二步:
php调用每个扩展的mshutdown方法,这是各个模块最后一次释放内存的机会。一个典型的rshutdown方法如下:
php_mshutdown_function(extension_name) {
/* free handlers and persistent memory etc */
}
这样,整个php生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。
下面的是用一些图示来说明的!
php底层工作原理
图1 php结构
从图上可以看出,php从下到上是一个4层体系
①zend引擎
zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。
②extensions
围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。
③sapi
sapi全称是server application programming interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍
④上层应用
这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。
构架思想:
引擎(zend)+组件(ext)的模式降低内部耦合
中间层(sapi)隔绝web server和php
**************************************************************************
如果php是一辆车,那么
车的框架就是php本身
zend是车的引擎(发动机)
ext下面的各种组件就是车的轮子
sapi可以看做是公路,车可以跑在不同类型的公路上
而一次php程序的执行就是汽车跑在公路上。
因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道
apache和php的关系apache对于php的解析,就是通过众多module中的php module来完成的。
把php最终集成到apache系统中,还需要对apache进行一些必要的设置。这里,我们就以php的mod_php5 sapi运行模式为例进行讲解,至于sapi这个概念后面我们还会详细讲解。
假定我们安装的版本是apache2 和 php5,那么需要编辑apache的主配置文件http.conf,在其中加入下面的几行内容:
unix/linux环境下:
loadmodule php5_module modules/mod_php5.so
addtype application/x-httpd-php .php
注:其中modules/mod_php5.so 是x系统环境下mod_php5.so文件的安装位置。
windows环境下:
loadmodule php5_module d:/php/php5apache2.dll
addtype application/x-httpd-php .php
注:其中d:/php/php5apache2.dll 是在windows环境下php5apache2.dll文件的安装位置。
这两项配置就是告诉apache server,以后收到的url用户请求,凡是以php作为后缀,就需要调用php5_module模块(mod_php5.so/ php5apache2.dll)进行处理。
apache的生命周期
apach的请求处理流程
apache请求处理循环详解
apache请求处理循环的11个阶段都做了哪些事情呢?(这11个阶段难道就是nginx中对应的11个处理阶段???)喎?http://www.bkjia.com/kf/ware/vc/ target=_blank class=keylink>vcd4kpha+cjgholbvc3qtumvhzc1szxf1zxn0vde2zjwvcd4kpha+ciagicdu2tx9s6ph68fztkba7ch3s8zw0kos1elkx8sjv+m/ydlusuxi67mz19o1xlxa0ru49r3xts6ho7bu09rex9cpz+u63ntnvfji67smwo3h68fztcteo7/pwltltaos1ek49r3xts6/ydlusbva+9pdoam8l3a+cjxwpgogicagmqgivvjjifryyw5zbgf0aw9uvde2zia8yni+ciagicbbcgfjagxu2rg+vde2zrxe1vfsqrmk1/ejur2rx+vh87xevvjm07pj5lw9sb612m7evp7ptc2zoapeo7/pv8ns1nta1ek917bosuxi67mz19ojrna00ndx1ly6tctts8nkwt+8ragjbw9kx2fsawfzvs3kx8d708pv4rj2vde2zrmk1/e1xkgjpc9wpgo8cd4kicagidohokhlywrlcibqyxjzaw5nvde2zia8yni+ciagicbbcgfjagxu2rg+vde2zrxe1vfsqrmk1/ejurzssunh68fztctnt7k/oaptydpaxko/6b/j0ttu2sfrx/o0psdtwfezzlxeym66ztk7upa148np1rtq0lzssunh68fzzbeyv7xeym7o8aos0vk0y9xiupa5s9ftutzj2bg7yrntw6gjbw9kx3nldgvudmlmvs3kx8d708pv4rj2vde2zrmk1/e1xkgjpc9wpgo8cd4kicagidshokfjy2vzcybdb250cm9svde2zia8yni+ciagicbbcgfjagxu2rg+vde2zrxe1vfsqrmk1/ejurj5vt3f5nbdzss8/rzssunkx7fx1mrq7bfdzsrh68fztctxyts0oanbcgfjagw1xlhq17zc37ytyrxp1shl1mrq7brnvty++na4we6ho21vzf9hdxroel9ob3n0vs3kx8d708pv4rj2vde2zrmk1/e1xkgjpc9wpgo8cd4kicagidwhokf1dghlbnrpy2f0aw9uvde2zia8yni+ciagicagqxbhy2hl1nqxvr3xts61xnb30qq5pnf3o7qwtnxvxetww87evp7j6laotcsy38luttttw7unvfjq0mjp1qsjrlkiyei2qnpdu6fd+8f40/kho8sjv+m/ydlu1nrv4r3xts6y5cjrubpx06osyrxp1tk7upbiz9akt723qkgjpc9wpgo8cd4kicagidahokf1dghvcml6yxrpb26917boidxicj4kicagiefwywnozdtasb6917botctw99kquatx96o6upm+3cxk1spoxlz+voyy6crht/huytdtym/wpln9tcttw7un1rtq0mfrx/o1xllz1/eho8sjv+m/ydlu1nrv4r3xts6y5cjrubpx06osyrxp1tk7upbtw7unykjp3rncwo21xle9t6ihozwvcd4kpha+ciagica3oajnsu1fifr5cgugq2hly2tpbme917boidxicj4kicagiefwywnozdtasb6917botctw99kquatx96o6upm+3cfrx/pxyts0tcrnsu1fwodqzbxez+c52lnm1pkjrmxqtqi9q9kqyrntw7xexnri3bsmwo26r8r9oaox6te8xko/6w1vzf9uzwdvdglhdglvbrrnbw9kx21pbwxktc/wwcvv4rj2ubpx06gjpc9wpgo8cd4kicagidihokzpefvwvde2zia8yni+ciagicdv4srh0ru49s2o08o1xl3xts6jrntk0o3eo7/p1nre2sjdyfqzycb31q7hskos1mvq0mjous6x2nkqtcs0psdtwfezzkgjus1qb3n0x1jlywrfumvxdwvzdmdgjimymdi4ndujrnxiysfsu7j2xny5u7k2u/hizrro0mxporxeubpx06os0rlkx9fus6pkudpdtcs5s9ftoam8l3a+cjxwpgogicagoagiumvzcg9uc2w917boidxicj4kicagiefwywnozdtasb6917botctw99kquatx96o6yfqzybe1u9i/zbuntsu1xmtayn2jrli61pc4+l/nu6e2y7eiy83su7j2x6g1sbxeu9i4tkgj1ek49r3xts7kx9x7upa0psdtwfezzlxeusvqxlk/t9ahozwvcd4kpha+ciagicaxmkgitg9nz2luz73xts4gpgjypgogicagqxbhy2hl1nqxvr3xts61xnb30qq5pnf3o7ru2rvyults0b6tt6llzbj4v827p7bl1q6687zhwrzkws7xoapeo7/pv8ne3ndeums78txfzoa7u0fwywnozbxeserxvmjv1r68x8k8oam8l3a+cjxwpgoxmagiq2xlyw5vcl3xts4gpgjypgogicagqxbhy2hl1nqxvr3xts61xnb30qq5pnf3o7rh5cdtsb60zsfrx/pkws7xtkba7c3qs8nwrrrz0sxb9lxeu7e+s6osscji587evp6hoss/wry1xlsmwo278txfu29ja2v0tcs52lhvtci1ykos1elkx0fwywnozdk7tm7h68fztkba7bxe1+6689k7upa917booam8l3a+cjxwpgo8c3ryb25npkxbtvc83lm5o7o8l3n0cm9uzz48l3a+cjxwpgo8aw1nihnyyz0=http://www.2cto.com/uploadfile/collfiles/20140607/20140607091102327.gif alt=b簗﹊萟?钅裣i啔a篧殽?{鷌?*s钠拽?'瞝_椐鷌糙铻於?凓i嗃i?耉檐y?m4簖html
百度研发中心的博客http://stblog.baidu-tech.com/?p=763
王兴宾的博客http://blog.csdn.net/wanghao72214/article/details/3916825
http://www.bkjia.com/phpjc/780964.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/780964.htmltecharticle之前做过.net,java开发,也写过几个php的网站,乎3种主要编程语言都接触了。但是越来越觉得自己对编程的整个流程缺乏一个整体的认识,...