php系列
phantom66
这货很懒
展开
-
74-魔术函数与延迟绑定
74-魔术函数与延迟绑定PHP中有一些特殊的函数和方法,这些函数和方法相比普通方法的特殊之处在于:用户代码通常不会主动调用, 而是在特定的时机会被PHP自动调用。在PHP中通常以”“打头的方法都作为魔术方法, 所以通常不要定义以”“开头的函数或方法。 例如:__autoload()函数, 通常我们不会手动调用这个函数, 而如果在代码中访问某个未定义的方法, 如过已经定义了__autoload()函数原创 2016-04-27 13:31:12 · 871 阅读 · 0 评论 -
89-变量的引用与计数规则
89-变量的引用与计数规则变量的内部引用和计数在引擎内部,一个PHP的变量是保存在“zval”结构中,此结构包含了变量的类型和值信息,这个在之前的文章 变量的内部存储:值和类型 中已经介绍了,此结构还有另外两个字段信息,一个是”is_ref”(此字段在5.3.2版本中是is_ref__gc),此字段是一个布尔值,用来标识变量是否是一个引用,通过这个字段,PHP引擎能够区分一般的变量和引用变量。PHP原创 2016-04-28 22:01:37 · 967 阅读 · 0 评论 -
php面试中的经典问题
问题一问题描述考虑下面代码:$str1 = 'yabadabadoo';$str2 = 'yaba';if (strpos($str1,$str2)) { echo "\"" . $str1 . "\" contains \"" . $str2 . "\"";} else { echo "\"" . $str1 . "\" does not contain \"" . $str原创 2016-04-29 23:02:22 · 8126 阅读 · 0 评论 -
12-PHP的FastCGI
CGI全称是“通用网关接口”(Common Gateway Interface), 它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。 CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。FastCGI是Web服务器和处理程序之间通信原创 2016-04-24 18:44:16 · 699 阅读 · 0 评论 -
90-新垃圾回收机制说明
90-新垃圾回收机制说明在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果refcount为0,那么变量的空间可以被释放,否则就不释放,这是一种非常简单的GC实现。然而在这种简单的GC实现方案中,出现了意想不到的变量内存泄漏情况(Bug:http://bugs.原创 2016-04-28 22:08:58 · 8029 阅读 · 0 评论 -
46-内存的申请与销毁
46-内存的申请与销毁PHP底层对内存的管理, 围绕着小块内存列表(free_buckets)、 大块内存列表(large_free_buckets)和 剩余内存列表(rest_buckets)三个列表来分层进行的。 ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存,通过对上面三种列表的填充, 建立一个类似于内存池的管原创 2016-04-26 12:23:06 · 1011 阅读 · 0 评论 -
08-Apache模块介绍
Apache概述Apache是目前世界上使用最为广泛的一种Web Server,它以跨平台、高效和稳定而闻名。按照去年官方统计的数据,Apache服务器的装机量占该市场60%以上的份额。尤其是在X(Unix/Linux)平台上,Apache是最常见的选择。其它的Web Server产品,比如IIS,只能运行在Windows平台上,是基于微软.Net架构技术的不二选择。Apache支持许多特性,大部分原创 2016-04-24 18:41:36 · 641 阅读 · 0 评论 -
44-Zend内存管理器
44-Zend内存管理器在PHP里,我们可以定义字符串变量,比如 Free the Mallocs每个平台操作内存的方式都是差不多的有两个方面,一负责申请,二负责释放。如果应用程序向系统申请内存,系统便会在内存中寻找还没有被使用的地方,如果有合适的,便分配给这个程序,并标记下来,不再给其它的程序了。如果一个内存块没有释放,而所有者应用程序也永远不再使用它了。那么,我们就称其为”内存泄漏”,那么这部分原创 2016-04-26 12:19:26 · 737 阅读 · 0 评论 -
68-类的成员变量
68-类的成员变量在上一小节,我们介绍了类的结构和声明过程,从而,我们知道了类的存储结构,接口抽象类等类型的实现方式。 在本小节,我们将介绍类的成员变量和成员方法。首先,我们看一下,什么是成员变量,什么是成员方法。类的成员变量在PHP中本质上是一个变量,只是这些变量都归属于某个类,并且给这些变量是有访问控制的。 类的成员变量也称为成员属性,它是现实世界实体属性的抽象,是可以用来描述对象状态的数据。类原创 2016-04-27 13:25:40 · 1060 阅读 · 0 评论 -
24-哈希碰撞攻击是什么?
24-哈希碰撞攻击是什么?最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招。本文结合PHP内核源码,聊一聊这种攻击的原理及实现。哈希表碰撞攻击的基本原理哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表。PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下原创 2016-04-25 12:21:32 · 12463 阅读 · 0 评论 -
87-代码的加密与解密
87-代码的加密与解密PHP语言作为脚本语言的一种,由于不需要进行编译,所以通常PHP程序的分发都是直接发布源代码。 对于一些开源软件来说,这并没有什么问题,因为它本来就希望有更多的人阅读代码,希望有更多的人参与进来, 而对于商业代码来说,这却是一个不太好的消息,不管是从商业秘密,还是从对公司产权的保护来说却是一个问题, 基于此,从而引出了对PHP代码的加密和解密的议题。 例如国内的Discuz论坛原创 2016-04-28 22:00:44 · 1716 阅读 · 0 评论 -
85-虚拟机的语法分析
85-虚拟机的语法分析Bison是一种通用目的的分析器生成器。它将LALR(1)上下文无关文法的描述转化成分析该文法的C程序。 使用它可以生成解释器,编译器,协议实现等多种程序。 Bison向上兼容Yacc,所有书写正确的Yacc语法都应该可以不加修改地在Bison下工作。 它不但与Yacc兼容还具有许多Yacc不具备的特性。Bison分析器文件是定义了名为yyparse并且实现了某个语法的函数的C原创 2016-04-28 21:59:30 · 7215 阅读 · 0 评论 -
75-保留类与特殊类
75-保留类与特殊类在面向对象语言中,都会内置一些语言内置提供的基本功能类,比如JavaScript中的Array,Number等类, PHP中也有很多这种类,比如Directory,stdClass,Exception等类,同时一些标准扩展比如PDO等扩展中也会定义一些类, PHP中类是不允许重复定义的,所以在编写代码时不允许定义已经存在的类。同时PHP中有一些特殊的类:self,static和p原创 2016-04-27 13:31:27 · 1512 阅读 · 0 评论 -
76-对象
76-对象对象是我们可以进行研究的任何事物,世间万物都可以看作对象。它不仅可以表示我们可以看到的具体事物, 也可以表示那些我们看不见的事件等。对象是一个实体,它具有状态,一般我们用变量来表示, 同时它也可以具有操作行为,一般用方法来表示,对象就是对象状态和对象行为的集合体。在之前我们很多次的说到类,对于对象来说,具有相同或相似性质的对象的抽象就是类。 因此,对象的抽象是类,类的具体化就是对象,我们常原创 2016-04-27 13:31:57 · 1101 阅读 · 0 评论 -
77-创建对象实例
77-创建对象实例为了操作一个对象,我们需要先获取这个对象的实例,而这有肯定会涉及调用对象的构造方法。首先我们先了解下一个object在PHP内核中到底是如何实现的。typedef struct _zend_object_value { zend_object_handle handle; zend_object_handlers *handlers;} zend_object_v原创 2016-04-27 13:32:12 · 960 阅读 · 0 评论 -
78-对象属性读写
78-对象属性读写这一节主要描述与对象属性有关的东西。有关如何对它进行定义的操作我们已经在上一章中描述过了,这里不再叙述,只讲对其的操作。读取对象的属性ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_bool silent TSRMLS原创 2016-04-27 13:32:42 · 1251 阅读 · 0 评论 -
79-命名空间
79-命名空间在维基百科中,对命名空间的定义是: 命名空间(英语:Namespace)表示标识符(identifier)的上下文(context)。一个标识符可在多个命名空间中定义, 它在不同命名空间中的含义是互不相干的。在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域内的标识符, 且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。 函数和类的作用域原创 2016-04-28 21:55:46 · 693 阅读 · 0 评论 -
80-定义接口
80-定义接口定义一个接口还是很方便的,我先给出一个PHP语言中的形式。<?phpinterface i_myinterface{ public function hello();}?>那它在扩展中的实现是这样的。zend_class_entry *i_myinterface_ce;static zend_function_entry i_myinterface_method[]=原创 2016-04-28 21:56:12 · 889 阅读 · 0 评论 -
81-继承与实现接口
81-继承与实现接口在定义一个类时往往会使其继承某个父类或者实现某个接口,在扩展中实现这个功能非常方便。下面我先给出PHP语言中的代码。<?phpinterface i_myinterface{ public function hello();}class parent_class implements i_myinterface{ public function hello原创 2016-04-28 21:56:33 · 830 阅读 · 0 评论 -
82-资源resource类型
82-资源resource类型讲述之前,先描述下{资源}类型在内核中的结构://每一个资源都是通过它来实现的。typedef struct _zend_rsrc_list_entry{ void *ptr; int type; int refcount;}zend_rsrc_list_entry;在真实世界中,我们经常需要操作一些不好用标量值表现的数据,比如某个文件的原创 2016-04-28 21:57:16 · 8208 阅读 · 0 评论 -
84-虚拟机的词法解析
84-虚拟机的词法解析语言从广义上来讲是人们进行沟通交流的各种表达符号。每种语言都有专属于自己的符号,表达方式和规则。 就编程语言来说,它也是由特定的符号,特定的表达方式和规则组成。 语言的作用是沟通,不管是自然语言,还是编程语言,它们的区别在于自然语言是人与人之间沟通的工具, 而编程语言是人与机器之间的沟通渠道。相对于自然语言,编程语言的历史还非常短, 虽然编程语言是站在历史巨人的基础上创建的,但原创 2016-04-28 21:58:52 · 4459 阅读 · 0 评论 -
07-再次探讨SAPI
在PHP的生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现。 这些内置实现的物理位置在PHP源码的SAPI目录。这个目录存放了PHP对各个服务器抽象层的代码, 例如命令行程序的实现,Apache的mod_php模块实现以及fastcgi的实现等等。在各个服务器抽象层之间遵守着相同的约定,这里我们称之为SAPI接口。 每个SAPI实现都是一个_sapi_module_struct结构体原创 2016-04-24 18:39:56 · 730 阅读 · 0 评论 -
45-PHP的内存管理
45-PHP的内存管理内存管理一般会包括以下的内容:是否有足够的内存供我们的程序使用;如何从足够可用的内存中获取部分内存;对于使用后的内存,是否可以将其销毁并将其重新分配给其它程序使用。与此对应,PHP的内容管理也包含这样的内容,只是这些内容在ZEND内核中是以宏的形式作为接口提供给外部使用。 后面两个操作分别对应emalloc宏,efree宏,而第一个操作可以根据emalloc宏返回结果检原创 2016-04-26 12:22:24 · 1263 阅读 · 0 评论 -
88-zend_execute的具体执行过程
88-zend_execute的具体执行过程解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h:ZEND_API void execute(zend_op_array *op_array TSRM原创 2016-04-28 22:01:04 · 7713 阅读 · 0 评论 -
09-通过mod_php5支持PHP
Apache对PHP的支持是通过Apache的模块mod_php5来支持的。如果希望Apache支持PHP的话,在./configure步骤需要指定–with-apxs2=/usr/local/apache2/bin/apxs 表示告诉编译器通过Apache的mod_php5/apxs来提供对PHP5的解析。在最后一步make install的时候我们会看到将动态链接库libphp5.so(Apac原创 2016-04-24 18:42:05 · 1603 阅读 · 0 评论 -
10-Apache运行与钩子函数
Apache是目前世界上使用最为广泛的一种Web Server,它以跨平台、高效和稳定而闻名。按照去年官方统计的数据,Apache服务器的装机量占该市场60%以上的份额。尤其是在X(Unix/Linux)平台上,Apache是最常见的选择。其它的Web Server产品,比如IIS,只能运行在Windows平台上,是基于微软.Net架构技术的不二选择。Apache并不是没有缺点,它最为诟病的一点就是原创 2016-04-24 18:43:03 · 1073 阅读 · 0 评论 -
11.嵌入式PHP
从PHP源码目录结构的介绍以及PHP生命周期可知:嵌入式PHP类似CLI,也是SAPI接口的另一种实现。 一般情况下,它的一个请求的生命周期也会和其它的SAPI一样:模块初始化=>请求初始化=>处理请求=>关闭请求=>关闭模块。 当然,这只是理想情况。因为特定的应用由自己特殊的需求,只是在处理PHP脚本这个环节基本一致。对于嵌入式PHP或许我们了解比较少,或者说根本用不到,甚至在网上相关的资料也不多原创 2016-04-24 18:43:30 · 1803 阅读 · 0 评论 -
13-如何执行PHP脚本
前面介绍了PHP的生命周期,PHP的SAPI,SAPI处于PHP整个架构较上层,而真正脚本的执行主要由Zend引擎来完成, 这一小节我们介绍PHP脚本的执行。目前编程语言可以分为两大类:第一类是像C/C++, .NET, Java之类的编译型语言, 它们的共性是:运行之前必须对源代码进行编译,然后运行编译后的目标文件。第二类比如PHP, Javascript, Ruby, Python这些解释型原创 2016-04-24 18:44:35 · 2070 阅读 · 0 评论 -
14-PHP脚本的执行细节
众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层——C语言,C语言更贴近人类熟悉的“自然语言”,程序设计者可以通过C语言编译原创 2016-04-24 18:45:57 · 1182 阅读 · 0 评论 -
15-操作码OpCode
运行一段PHP代码主要有两个阶段:编译和执行。 当然编译过程中还包括词法分析语法分析不同阶段和细节,这里我们将其作为一个整体。在这两个阶段之间,PHP代码会被编译成op code,可以将其认为是引擎的一个中间语言,编辑阶段把PHP源码生成op code,然后在执行阶段执行这些op code。这篇文章将简单的介绍op code。PHP代码编译之后会生成许多的op,每一个op都是一个zend_op类型的原创 2016-04-24 18:46:14 · 1189 阅读 · 0 评论 -
16-PHP里的opcode
opcode是计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令规范指定。 除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数。 这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。通常opcode还有另一种称谓:字节码(byte codes)。 例如Java虚拟机(JVM),.NET的通用中间语言(CIL: Common原创 2016-04-24 18:46:40 · 787 阅读 · 0 评论 -
17-解释器的执行过程
这里将介绍引擎内部执行一个PHP脚本的流程,以CLI SAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。CLI(Command Line Interface)即PHP的命令行模式,现在此SAPI是默认安装的,我们在服务器上安装完PHP之后,一般会生成一个可执行文件,假设此文件为/usr/local/bin/php ,那么我们在SHELL下可以用以下命令来执行一个PHP脚本:/u原创 2016-04-24 18:46:55 · 1119 阅读 · 0 评论 -
18-变量概述
现代编程语言中的基本元素主要有:变量,流程控制接口,函数等等。我能否不使用变量来编写程序呢? 这显然是可以的,例如:<?phpecho "Hello NowaMagic";?>这个程序很简单,输出一个字符串内容。就和我们仅仅使用二进制也能编程一样,不使用变量也能完成大部分的工作,不使用变量我们的程序将丧失极大的灵活性, 变量可以让我们将值存储起来,以便在程序的其他地方使用,或者通过计算保存新的原创 2016-04-24 18:47:30 · 815 阅读 · 0 评论 -
06-Zend引擎
相信很多人都听说过 Zend Engine 这个名词,也有很多人知道 Zend Engine 就是 PHP 语言的核心,但若要问一句:Zend Engine 到底存在于何处?或者说,Zend Engine 究竟是在什么时候怎么发挥作用让 PHP 源码输出我们想要的东西的?Zend引擎是PHP实现的核心,提供了语言实现上的基础设施。例如:PHP的语法实现,脚本的编译运行环境, 扩展机制以及内存管理等,原创 2016-04-24 18:39:11 · 568 阅读 · 0 评论 -
05-多进程⁄线程的SAPI生命周期
多进程的SAPI生命周期通常PHP是编译为apache的一个模块来处理PHP请求。Apache一般会采用多进程模式, Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节, 不过每个进程的开始阶段只在进程fork出来以来后进行,在整个进程的生命周期内可能会处理多个请求。 只有在Apache关闭或者进程被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个原创 2016-04-24 18:38:13 · 988 阅读 · 0 评论 -
86-中间代码opcode的执行
86-中间代码opcode的执行假如我们现在使用的是CLI模式,直接在SAPI/cli/php_cli.c文件中找到main 函数, 默认情况下PHP的CLI模式的行为模式为PHP_MODE_STANDARD。 此行为模式中PHP内核会调用php_execute_script(&file_handle TSRMLS_CC);来执行PHP文件。 顺着这条执行的线路,可以看到一个PHP文件在经过词法分析原创 2016-04-28 22:00:15 · 8306 阅读 · 0 评论 -
83-Zend虚拟机
83-Zend虚拟机通过前面的学习,我们了解到一个PHP文件在服务器端的执行过程包括以下两个大的过程:递给php程序需要执行的文件, php程序完成基本的准备工作后启动PHP及Zend 引擎, 加载注册的扩展模块。初始化完成后读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。然后编译成opcode执行。 如过安装了apc之类的opcode缓存, 编译环节可能会被跳过而直接从缓存中读取o原创 2016-04-28 21:58:30 · 799 阅读 · 0 评论 -
47-引用计数与写时复制
47-引用计数与写时复制对于PHP这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错。另一方面,除了要安全申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千计的请求,为了提高系统整体的性能,每一次操作都应该只使用最少的内存,对于不必要的相同数据的复制则应该能免则免。我们来看下面这段PHP代码:<?php$a = 'Hello Nowa原创 2016-04-26 12:28:30 · 5241 阅读 · 0 评论 -
21-理解Zend里的哈希表
21-理解Zend里的哈希表在PHP的Zend引擎中,有一个数据结构非常重要,它无处不在,是PHP数据存储的核心,各种常量、变量、函数、类、对象等都用它来组织,这个数据结构就是HashTable。HashTable在通常的数据结构教材中也称作散列表,哈希表。其基本原理比较简单(如果你对其不熟悉,请查阅随便一本数据结构教材或在网上搜索),但PHP的实现有其独特的地方。理解了HashTable的数据存储原创 2016-04-25 12:19:17 · 5824 阅读 · 0 评论 -
35-变量类型提示
35-变量类型提示PHP是弱类型语言,向方法传递参数时候也并不严格检查数据类型。 不过有时需要判断传递到方法中的参数,为此PHP中提供了一些函数,来判断数据的类型。 比如is_numeric(),判断是否是一个数值或者可转换为数值的字符串,比如用于判断对象的类型运算符:instanceof。 instanceof 用来测定一个给定的对象是否来自指定的对象类。instanceof 运算符是 PHP 5原创 2016-04-25 12:26:34 · 548 阅读 · 0 评论