201411-07 PHP内核探索 —— Apache模块介绍 Apache概述Apache是目前世界上使用最为广泛的一种WebServer,它以跨平台、高效和稳定而闻名。按照去年官方统计的数据,Apache服务器的装机量占该市场60%以上的份额。尤其是在X(Unix/Linux)平台上,Apache是最常见的选择。其它的WebServer产品,比如IIS,只能运行在Windows平台上,是基于微软.Net架构技术的不二选择。Apache支持许多特性,大部分通过模块扩展实现。常见的模块包括mod_auth(权限验证)、mod_ssl(SSL和TLS支... 继续阅读 >
201411-07 PHP内核探索 —— 通过mod_php5支持PHP Apache对PHP的支持是通过Apache的模块mod_php5来支持的。如果希望Apache支持PHP的话,在./configure步骤需要指定--with-apxs2=/usr/local/apache2/bin/apxs 表示告诉编译器通过Apache的mod_php5/apxs来提供对PHP5的解析。在最后一步makeinstall的时候我们会看到将动态链接库libphp5.so(Apache模块)拷贝到apache2的安装目录的modules目录下,并且还需要在httpd.conf配置文件中添加LoadModule语句来动态将libphp5.so 模块加载进... 继续阅读 >
201411-07 PHP内核探索 —— Apache运行与钩子函数 Apache是目前世界上使用最为广泛的一种WebServer,它以跨平台、高效和稳定而闻名。按照去年官方统计的数据,Apache服务器的装机量占该市场60%以上的份额。尤其是在X(Unix/Linux)平台上,Apache是最常见的选择。其它的WebServer产品,比如IIS,只能运行在Windows平台上,是基于微软.Net架构技术的不二选择。Apache并不是没有缺点,它最为诟病的一点就是变得越来越重,被普遍认为是重量级的WebServer。所以,近年来又涌现出了很... 继续阅读 >
201411-07 PHP内核探索 —— 嵌入式PHP:类似CLI 从PHP源码目录结构的介绍以及PHP生命周期可知:嵌入式PHP类似CLI,也是SAPI接口的另一种实现。一般情况下,它的一个请求的生命周期也会和其它的SAPI一样:模块初始化=>请求初始化=>处理请求=>关闭请求=>关闭模块。当然,这只是理想情况。因为特定的应用由自己特殊的需求,只是在处理PHP脚本这个环节基本一致。对于嵌入式PHP或许我们了解比较少,或者说根本用不到,甚至在网上相关的资料也不多,例如很多游戏中使用Lua语言作为... 继续阅读 >
201411-07 PHP内核探索 —— PHP的FastCGI:FastCGI的整个工作流程 CGI全称是“通用网关接口”(CommonGatewayInterface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。CGI描述了客户端和这个程序之间传输数据的一种标准。CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。FastCGI是Web服务器和处理程序之间通信的一种协议,是CGI的一种改进方案,FastCGI像是一个常驻(long-li... 继续阅读 >
201411-07 PHP内核探索 —— 如何执行PHP脚本:Zend引擎是如何解释PHP脚本的 前面介绍了PHP的生命周期,PHP的SAPI,SAPI处于PHP整个架构较上层,而真正脚本的执行主要由Zend引擎来完成,这一小节我们介绍PHP脚本的执行。目前编程语言可以分为两大类:第一类是像C/C++,.NET,Java之类的编译型语言,它们的共性是:运行之前必须对源代码进行编译,然后运行编译后的目标文件。第二类比如PHP,Javascript,Ruby,Python这些解释型语言,他们都无需经过编译即可“运行”。虽然可以理解为直接运行,... 继续阅读 >
201411-07 PHP内核探索 —— PHP脚本的执行细节:PHP、C、汇编、机器码 众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层——C语言,C语言更贴近人类熟悉的“自然语言”,程序设计者可以通过C语言编译器将C源代码... 继续阅读 >
201411-07 PHP内核探索 —— 操作码OpCode:计算机最终是执行这些OpCode 运行一段PHP代码主要有两个阶段:编译和执行。当然编译过程中还包括词法分析语法分析不同阶段和细节,这里我们将其作为一个整体。在这两个阶段之间,PHP代码会被编译成opcode,可以将其认为是引擎的一个中间语言,编辑阶段把PHP源码生成opcode,然后在执行阶段执行这些opcode。这篇文章将简单的介绍opcode。PHP代码编译之后会生成许多的op,每一个op都是一个zend_op类型的c变量。相关的定义可以在{PHPSRC}/Zend/zend_compile.h中... 继续阅读 >
201411-07 PHP内核探索 —— PHP里的opcode:Zend虚拟机中的指令 opcode是计算机指令中的一部分,用于指定要执行的操作,指令的格式和规范由处理器的指令规范指定。除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数。这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。通常opcode还有另一种称谓:字节码(bytecodes)。例如Java虚拟机(JVM),.NET的通用中间语言(CIL:CommonIntermeditateLanguage)等等。PHP中的opcode则属于前面... 继续阅读 >
201411-07 PHP内核探索 —— 解释器的执行过程:引擎是如何执行PHP代码的 这里将介绍引擎内部执行一个PHP脚本的流程,以CLISAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。CLI(CommandLineInterface)即PHP的命令行模式,现在此SAPI是默认安装的,我们在服务器上安装完PHP之后,一般会生成一个可执行文件,假设此文件为/usr/local/bin/php ,那么我们在SHELL下可以用以下命令来执行一个PHP脚本:/usr/local/bin/php-ftest.php这个命令将执行当前目录下的test.php脚本,我... 继续阅读 >
201411-07 PHP内核探索 —— 变量概述:变量在PHP的内部如何实现 现代编程语言中的基本元素主要有:变量,流程控制接口,函数等等。我能否不使用变量来编写程序呢?这显然是可以的,例如:<?phpecho"HelloWorld";?>这个程序很简单,输出一个字符串内容。就和我们仅仅使用二进制也能编程一样,不使用变量也能完成大部分的工作,不使用变量我们的程序将丧失极大的灵活性,变量可以让我们将值存储起来,以便在程序的其他地方使用,或者通过计算保存新的值。变量具有三个基本特性:名称。变... 继续阅读 >
201411-07 PHP内核探索 —— 变量存储与类型 先回答前面一节的那个问题吧。<?php$foo=10;$bar=20;functionchange(){global$foo;//echo'函数内部$foo='.$foo.'<br/>';//如果不把$bar定义为global变量,函数体内是不能访问$bar的$bar=0;$foo++;}change();echo$foo,'',$bar;?>程序输出1120。原因是,方法内部无法访问$bar变量,所以它的值还是20。使用global之后,可以取得$foo的值,自增后$foo的值就是11。Global的作用是定义全局变量,但... 继续阅读 >
201411-07 PHP内核探索 —— PHP中的哈希表:哈希表是PHP实现中尤为关键的数据结构 PHP中使用最为频繁的数据类型非字符串和数组莫属,PHP比较容易上手也得益于非常灵活的数组类型。在开始详细介绍这些数据类型之前有必要介绍一下哈希表(HashTable)。哈希表是PHP实现中尤为关键的数据结构。哈希表在实践中使用的非常广泛,例如编译器通常会维护的一个符号表来保存标记,很多高级语言中也显式的支持哈希表。哈希表通常提供查找(Search),插入(Insert),删除(Delete)等操作,这些操作在最坏的情况下和链表的性能一... 继续阅读 >
201411-07 PHP内核探索 —— 理解Zend里的哈希表 在PHP的Zend引擎中,有一个数据结构非常重要,它无处不在,是PHP数据存储的核心,各种常量、变量、函数、类、对象等都用它来组织,这个数据结构就是HashTable。HashTable在通常的数据结构教材中也称作散列表,哈希表。其基本原理比较简单(如果你对其不熟悉,请查阅随便一本数据结构教材或在网上搜索),但PHP的实现有其独特的地方。理解了HashTable的数据存储结构,对我们分析PHP的源代码,特别是ZendEngine中的虚拟机的实现时... 继续阅读 >
201411-07 PHP内核探索 —— PHP哈希算法设计 HashTable是PHP的核心,这话一点都不过分。PHP的数组、关联数组、对象属性、函数表、符号表等等都是用HashTable来做为容器的。PHP的HashTable采用的拉链法来解决冲突,这个自不用多说,我今天主要关注的就是PHP的Hash算法,和这个算法本身透露出来的一些思想。PHP的Hash采用的是目前最为普遍的DJBX33A(DanielJ.Bernstein,Times33withAddition),这个算法被广泛运用与多个软件项目,Apache、Perl和BerkeleyDB等。对于字符... 继续阅读 >
201411-07 PHP内核探索 —— 哈希碰撞攻击是什么:攻击的原理及实现 最近哈希表碰撞攻击(HashtablecollisionsasDOSattack)的话题不断被提起,各种语言纷纷中招。本文结合PHP内核源码,聊一聊这种攻击的原理及实现。哈希表碰撞攻击的基本原理哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表。PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结构存储)。理想情况下... 继续阅读 >