以图明志

PHP服务器脚本

PHP内核探索:变量的存储

变量存储在一个HashTable实现的符号表里
PHP中的变量类型和值是通过C语言实现的,内核具体是如何组织用户在PHP中定义的变量呢?Hash Table在ZE内核中被广泛使用,PHP变量也正是存储在一个HashTable实现的符号表里。当在PHP中调用一个函数或者类时,内核会创建一个新的符号表,这也是为什么在函数中无法使用函数外部定义的变量的原因。因为他们分属两个符号表,一个当前作用域,一个全局作用域。

PHP服务器脚本

PHP内核探索:常量的实现

脱离C语言和数学讨论底层都是耍流氓
常量,顾名思义是一个常态的量值。它与值只绑定一次,它的作用在于有肋于增加程序的可读性和可靠性。 在PHP中,常量的名字是一个简单值的标识符,在脚本执行期间该值不能改变。 和变量一样,常量默认为大小写敏感,但是按照我们的习惯常量标识符总是大写的。 常量名和其它任何 PHP 标签遵循同样的命名规则。

PHP服务器脚本

PHP内核探索:哈希碰撞攻击是什么?

攻击的原理及实现
哈希表碰撞攻击就是通过精心构造数据,使得所有数据全部碰撞,人为将哈希表变成一个退化的单链表,此时哈希表各种操作的时间均提升了一个数量级,因此会消耗大量CPU资源,导致系统无法快速响应请求,从而达到拒绝服务攻击(DoS)的目的。

PHP服务器脚本

PHP内核探索:翻译一篇HashTables文章

PHP中的任何东西都是哈希表
大家都应该知道PHP数组,它可以保存一系列元素,并且可以用一个key来标识每个元素,这个key可以是整数或字符串。因而我们需要在内存中有一个高效的方案来保存这种关联关系。其中一个高效的方案是把内存中的这些数据存储为”真正“的数组,一个从索引0开始到n的连续序列。

PHP服务器脚本

PHP内核探索:PHP哈希算法设计

PHP中的Hash算法
Hash Table是PHP的核心,这话一点都不过分。PHP的数组、关联数组、对象属性、函数表、符号表等等都是用HashTable来做为容器的。PHP的HashTable采用的拉链法来解决冲突,这个自不用多说,我今天主要关注的就是PHP的Hash算法,和这个算法本身透露出来的一些思想。

PHP服务器脚本

PHP内核探索:理解Zend里的哈希表

Zend HashTable源码分析
在PHP的Zend引擎中,有一个数据结构非常重要,它无处不在,是PHP数据存储的核心,各种常量、变量、函数、类、对象等都用它来组织,这个数据结构就是HashTable。HashTable在通常的数据结构教材中也称作散列表,哈希表。其基本原理比较简单(如果你对其不熟悉,请查阅随便一本数据结构教材或在网上搜索),但PHP的实现有其独特的地方。

PHP服务器脚本

PHP内核探索:PHP中的哈希表

哈希表是PHP实现中尤为关键的数据结构
PHP中使用最为频繁的数据类型非字符串和数组莫属,PHP比较容易上手也得益于非常灵活的数组类型。 在开始详细介绍这些数据类型之前有必要介绍一下哈希表(HashTable)。 哈希表是PHP实现中尤为关键的数据结构。哈希表在实践中使用的非常广泛,例如编译器通常会维护的一个符号表来保存标记,很多高级语言中也显式的支持哈希表。

PHP服务器脚本

PHP内核探索:变量存储与类型

存储结构与变量类型
前言中提到变量的三个基本特性,其中的有一个特性为变量的类型,变量都有特定的类型, 如:字符串、数组、对象等等。编程语言的类型系统可以分为强类型和弱类型两种:强类型语言是一旦某个变量被申明为某个类型的变量,则在程序运行过程中,该不能将该变量的类型以外的值赋予给它。

PHP服务器脚本

PHP内核探索:变量概述

变量在PHP的内部是如何实现的呢
就和我们仅仅使用二进制也能编程一样,不使用变量也能完成大部分的工作,不使用变量我们的程序将丧失极大的灵活性, 变量可以让我们将值存储起来,以便在程序的其他地方使用,或者通过计算保存新的值。 变量具有三个基本特性:名称,类型与值内容。

PHP服务器脚本

PHP内核探索:解释器的执行过程

引擎是如何执行PHP代码的
这里将介绍引擎内部执行一个PHP脚本的流程,以CLI SAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。CLI(Command Line Interface)即PHP的命令行模式,现在此SAPI是默认安装的,我们在服务器上安装完PHP之后,一般会生成一个可执行文件。

PHP服务器脚本

PHP内核探索:PHP里的opcode

PHP的opcode就是Zend虚拟机中的指令
通常opcode还有另一种称谓:字节码(byte codes)。 例如Java虚拟机(JVM),.NET的通用中间语言(CIL: Common Intermeditate Language)等等。PHP中的opcode则属于前面介绍中的后着,PHP是构建在Zend虚拟机(Zend VM)之上的。PHP的opcode就是Zend虚拟机中的指令。

PHP服务器脚本

PHP内核探索:操作码OpCode

计算机最终是执行这些OpCode
运行一段PHP代码主要有两个阶段:编译和执行。 当然编译过程中还包括词法分析语法分析不同阶段和细节,这里我们将其作为一个整体。在这两个阶段之间,PHP代码会被编译成op code,可以将其认为是引擎的一个中间语言,编辑阶段把PHP源码生成op code,然后在执行阶段执行这些op code。这篇文章将简单的介绍op code。

PHP服务器脚本

PHP内核探索:PHP脚本的执行细节

PHP-C-汇编-机器码
众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层——C语言。

PHP服务器脚本

PHP内核探索:如何执行PHP脚本

Zend引擎是如何解释PHP脚本的
机器只能理解机器语言,那这些语言是怎么被执行的呢, 一般这些语言都需要一个解释器, 由解释器来执行这些源码, 实际上这些语言还是会经过编译环节,只不过它们一般会在运行的时候实时进行编译。为了效率,并不是所有语言在每次执行的时候都会重新编译一遍, 比如PHP的各种opcode缓存扩展。

PHP服务器脚本

PHP内核探索:PHP的FastCGI

FastCGI的整个工作流程
PHP的CGI实现了Fastcgi协议,是一个TCP或UDP协议的服务器接受来自Web服务器的请求, 当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期: 模块初始化,sapi初始化,处理PHP请求,模块关闭,sapi关闭等就构成了整个CGI的生命周期。

PHP服务器脚本

PHP内核探索:嵌入式PHP

嵌入式PHP类似CLI
从PHP源码目录结构的介绍以及PHP生命周期可知:嵌入式PHP类似CLI,也是SAPI接口的另一种实现。 一般情况下,它的一个请求的生命周期也会和其它的SAPI一样:模块初始化=>请求初始化=>处理请求=>关闭请求=>关闭模块。 当然,这只是理想情况。因为特定的应用由自己特殊的需求,只是在处理PHP脚本这个环节基本一致。
5 / 6 首页 < Prev 2 3 4 5 6 Next > 尾页 页码: