07 2010 档案

摘要:在PHP语言中,变量都是保存在哈希表中,称为变量符号表,其中变量名为哈希表的键,变量名对应的容器zval的指针为哈希表中的值。所有全局变量放在一张主符号表中(也就是数组$GLOBALS对应的哈希表)。PHP语言有个特性,变量在命名时,$变量标识符后不能以数字开头。例如我们在以下代码:<?php$111= "my";?>会报如下错误:Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in...从错误的描叙来看,这是一个语法错误,于是我们推论对变量 阅读全文
posted @ 2010-07-20 16:32 java高手 阅读(302) 评论(0) 推荐(0)
摘要:概述在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果refcount为0,那么变量的空间可以被释放,否则就不释放,这是一种非常简单的GC实现。然而在这种简单的GC实现方案中,出现了意想不到的变量内存泄漏情况(Bug:http://bugs.php.net/bug.php?id=33595),引擎将无法回收这些内存,于是在PHP5.3中出现了新的GC,新的GC有专门的机制负责清理垃圾数据,防止内存泄漏。本文将详细的阐述PHP5.3中新的GC运行机制。 目前 阅读全文
posted @ 2010-07-14 16:14 java高手 阅读(254) 评论(0) 推荐(0)
摘要:变量的内部引用和计数 在引擎内部,一个PHP的变量是保存在“zval”结构中,此结构包含了变量的类型和值信息,这个在之前的文章 变量的内部存储:值和类型 中已经介绍了,此结构还有另外两个字段信息,一个是"is_ref"(此字段在5.3.2版本中是is_ref__gc),此字段是一个布尔值,用来标识变量是否是一个引用,通过这个字段,PHP引擎能够区分一般的变量和引用变量。PHP代码中可以通过 & 操作符号来建立一个引用变量,建立的引用变量内部的zval的is_ref字段就为1。zval中还有另外一个字段refcount(此字段在5.3.2版本中是refcount__g 阅读全文
posted @ 2010-07-13 21:17 java高手 阅读(286) 评论(0) 推荐(0)
摘要:北京图灵文化发展有限公司5周年生日会于7月3日在SOHO尚都的微薄之盐酒吧举行。来自公司版权合作伙伴、新闻媒体、作译者的数十位嘉宾到场庆贺。人民邮电出版社的领导也出席并讲话。会上回顾了图灵公司5年来的发展历程,公司员工演出了各种文艺节目。图灵公司自2005年成立以来,一直致力于翻译引进国外优秀的计算机图书,5年来累计出版图书逾530多种,累计销售码洋超过1.2亿。在计算机图书市场持续低糜的背景下,图灵公司的图书销售每年持续增长,其中2009年销售码洋达到3800万元,2010年仍将上一个新台阶。公司以“站在巨人的肩上”为座右铭,追求卓越,严格自律,始终重视图书出版质量,下大力气加强翻译、编辑、 阅读全文
posted @ 2010-07-08 18:04 java高手 阅读(111) 评论(0) 推荐(0)
摘要:解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h:ZEND_API void execute(zend_op_array *op_array TSRMLS_DC){ zend_execute_data *execute_data; zend_bool nested = 0; zend_bool original_in_execution = EG(in_execution); if (E. 阅读全文
posted @ 2010-07-08 16:49 java高手 阅读(480) 评论(0) 推荐(0)
摘要:运行一段PHP代码主要有两个阶段:编译和执行, 当然编译过程中还包括词法分析语法分析不同阶段和细节,这里我们将其作为一个整体。在这两个阶段之间,PHP代码会被编译成op code,可以将其认为是引擎的一个中间语言,编辑阶段把PHP源码生成op code,然后在执行阶段执行这些op code。这篇文章将简单的介绍op code。 PHP代码编译之后会生成许多的op,每一个op都是一个zend_op类型的c变量。相关的定义可以在{PHPSRC}/Zend/zend_compile.h中看到:struct _zend_op { opcode_handler_t handler; znode res. 阅读全文
posted @ 2010-07-08 15:28 java高手 阅读(1551) 评论(0) 推荐(0)
摘要:图灵五周年活动汇集 : 【互动】图灵5周年之“Linux盛宴” 【互动】《UNIX网络编程》买赠活动 【卓越】图灵5周年专题感恩活动 【上海第一书店】图灵图书真情回馈读者 【当当】图灵5周年之“Linux盛宴” 重点推荐:UNIX网络编程.卷1,套接字联网API(第3版)(中文版)UNIX网络编程.卷2,进程间通信(第2版)(中文版)JavaScript高级程序设计:第2版Oracle优化日记:一个金牌DBA的故事面向模式的软件架构.第4卷,分布式计算的模式语言更多内容,请点击这里。 阅读全文
posted @ 2010-07-07 17:30 java高手 阅读(97) 评论(0) 推荐(0)
摘要:VLD(Vulcan Logic Dumper)的简介如下:The Vulcan Logic Dumper hooks into the Zend Engine and dumps all the opcodes (execution units) of a script. It can be used to see what is going on in the Zend Engine. 之前的文章 PHP解释器引擎执行流程 结尾处提到了VLD的原理,此扩展利用PHP对扩展模块提供的请求初始化钩子函数(PHP_RINIT_FUNCTION),在每此请求到来的时候将默认的编译函数指针zend. 阅读全文
posted @ 2010-07-07 14:32 java高手 阅读(690) 评论(0) 推荐(0)
摘要:PHP是一种弱类型的脚本语言,弱类型不表示PHP的变量没有类型区分,PHP变量有8种原始类型:四种标量类型: boolean(布尔型) integer(整型) float(浮点型) string(字符串) 两种复合类型: array(数组) object(对象) 两种特殊类型: resource(资源) NULL 一个变量能在运行期间从一种类型转换为另一种类型,那么PHP是如何实现这种变量的类型戏法的呢?在引擎内部,变量都是用一个结构体来表示,这个结构体可以在{PHPSRC}/Zend/zend.h中找到:struct _zval_struct { /* Variable informati. 阅读全文
posted @ 2010-07-07 11:16 java高手 阅读(300) 评论(0) 推荐(0)
摘要:这里将介绍引擎内部执行一个PHP脚本的流程,以cli SAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。cli(Command Line Interface)即PHP的命令行模式,现在此SAPI是默认安装的,我们在服务器上安装完PHP之后,一般会生成一个可执行文件,假设此文件为/usr/local/bin/php,那么我们在SHELL下可以用以下命令来执行一个PHP脚本:/usr/local/bin/php -ftest.php这个命令将执行当前目录下的test.php脚本,我们暂且不关心test.php具体内容,只关心一下这个执行的内部过程是怎么样的。cli的主源代码. 阅读全文
posted @ 2010-07-06 16:06 java高手 阅读(588) 评论(0) 推荐(0)
摘要:众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层-C语言,C语言更贴近人类熟悉的“自然语言”,程序设计者可以通过C语言编译器将C源代码文件编译成目标文件(二进制文件,中间会先翻译成汇编语言,然后由汇编语言生成机器码),然后将各个目标文件连接在一起就组成了一个可执行文件。正如有人说过的一句名言“计算机科学领域的任何问题都. 阅读全文
posted @ 2010-07-05 18:15 java高手 阅读(1069) 评论(0) 推荐(0)