自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

企鹅漫步

关注数据库,分布式,缓存,系统架构

  • 博客(99)
  • 资源 (1)
  • 收藏
  • 关注

原创 php源代码解析:引用与函数执行

一个函数的执行结果要返回给调用者,除了使用return功能,还有一种办法,那就是以引用的形式传递参数,然后在内部修改这个参数的值。前一种方法往往只能返回一个值,如果我们的函数执行结果具有多种数据,便需要把这些数据打包到一个数组、类等复合类型的变量中才能得以实现;但后一种方法相比而言就简单一些了。运行时传递引用:Call-time Pass-by-ref标题有点绕口,其实很简单,功能

2013-12-28 00:47:41 1236

原创 PHP源码:zend_parse_parameters函数

最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表这参数的个数。紧接着需要传递个zend_par

2013-12-26 11:42:35 1015

原创 rabbitmq实战(广播模式)

RabbitMQ的结构图如下: 几个概念说明:Broker:简单来说就是消息队列服务器实体。Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。Queue:消息队列载体,每个消息都会被投入到一个或多个队列。Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。Routing Key:路由关键

2013-12-24 16:22:35 11371

原创 centos6.3安装rabbitmq实战

启用EPEL:EPEL是一个Fedora Project 推出的 EPEL(Extra Packages for Enterprise Linux),EPEL是RHEL 的 Fedora 软件仓库,把它添上,你就可以获得 RHEL AS 的高质量、高性能、高可靠性,又需要方便易用(关键是免费)的软件包更新功能安装rabbitmqwget http://mirror.neu.edu.cn/f

2013-12-23 23:39:48 1040

原创 实战CentOS 6.3安装配置supervisor进程管理工具

1.下载包wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.eggwget http://pypi.python.org/packages/source/s/supervisor/supervisor-3.0b1.tar.gzwget https://pypi.python.org

2013-12-23 18:20:20 5257

原创 Mysql查询按照某字段指定顺序排序

SELECT * FROM documents WHERE id IN (5,3,6,1) ORDER BY FIELD(id,5,3,6,1);或者SELECT * FROM documents WHERE id IN (5,3,6,1) ORDER BY substring_index((id,5,3,6,1),id,1);

2013-12-23 17:24:41 3998

原创 linux学习路线

Linux技术学习路线如果你要学习Linux,下面的学习路线图可以作为参考:

2013-12-22 15:35:53 1331

原创 生成N个不重复的随机数

<?php/** array unique_rand( int $min, int $max, int $num )* 生成一定数量的不重复随机数* $min 和 $max: 指定随机数的范围* $num: 指定生成数量*/function unique_rand($min, $max, $num) { $count = 0; $return = array();

2013-12-22 15:33:53 1861 1

转载 Twitter背后用到了哪些开源软件与技术?

如果没有开源软件,Twitter将不会存在。你发送和接收的每一个Tweet在移动端和PC端发送的过程中,都会需要开源软件。我们非常好奇Twitter使用了多少开源软件。除此之外,我们想要知道开源对Twitter公司的文化产生了什么影响。我们采访了Twitter公司主管开源的Manager Chris Aniszczyk,来和我们大家分享Twitter的开源故事。Aniszczxk将会在本月

2013-12-22 15:21:20 1645

原创 撑起大规模PHP网站的开源工具

在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de。Poppen.de是德国的一个社交网站,相对Facebook、Flickr来说是一个很小的网站,但它有一个很好的架构,融合了很多技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsu

2013-12-22 15:19:44 892

原创 php数组源码分析

PHP中经常使用数组,使用数组最大的好处便是速度!读写都可以在O(1)内完成,因为它每个元素的大小都是一致的,只要知道下标,便可以瞬间计算出其对应的元素在内存中的位置,从而直接取出或者写入。那么内核中是如何实现的呢?PHP大部分功能,都是通过HashTable来实现,其中就包括数组。HashTable即具有双向链表的优点,同时具有能与数据匹敌的操作性能。PHP中的定义的变量保存在一个符号表

2013-12-22 14:36:01 974

原创 php使用哈希表API

Zend把与HashTable有关的API分成了好几类以便于我们寻找,这些API的返回值大多都是常量SUCCESS或者FAILURE。创建HashTable下面在介绍函数原型的时候都使用了ht名称,但是我们在编写扩展的时候,一定不要使用这个名称,因为一些PHP宏展开后会声明这个名称的变量,进而引发命名冲突。创建并初始化一个HashTable非常简单,只要使用zend_has

2013-12-22 14:27:30 1029

原创 php写时复制计数

写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。 引用计数存在的意义,就是为了使得COW可以正常运作

2013-12-19 23:01:13 1109

原创 漫谈php引用计数

对于PHP这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错。另一方面,除了要安全的申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千计的请求,为了提高系统整体的性能,每一次操作都应该只使用最少的内存,对于不必要的相同数据的复制则应该能免则免。我们来看下面这段PHP代码:$a = 'Hello NowaMagic!';$b

2013-12-19 22:57:58 925

原创 memcacheq使用小结

一,BerkeleyDB下载软件包,http://download.oracle.com/berkeley-db/db-5.0.21.tar.gz解压缩后,cd build_unix../dist/configuremakesudo make install二,libevent (需要1.4.x 或更高)下载软件包:http://monkey.org/~provos/libev

2013-12-19 19:02:39 1352

原创 漫谈php全局变量Global

global语句的作用是定义全局变量,例如如果想在函数内访问全局作用域内的变量则可以通过global声明来定义。 下面从语法解释开始分析。1. 词法解析查看 Zend/zend_language_scanner.l文件,搜索 global关键字。我们可以找到如下代码:"global" {return T_GLOBAL;}2. 语法解析

2013-12-19 00:45:25 817

原创 诡异的php变量名

在类的方法中,$this关键字用来指向当前类的对象实例,如果对$this进行赋值操作,会发生什么事情?class Person  {      protected $_name = "phper";        protected $_age  = 18;        public function getName()      {          $

2013-12-19 00:30:55 815

原创 谈谈php变量作用域

全局变量与局部变量变量按作用域类型分为:全局变量和局部变量。全局变量是在整个程序中任何地方随意调用的变量, 在PHP中,全局变量的“全局化”使用gloal语句来实现。 相对于全局变量,局部变量的作用域是程序中的部分代码(如函数中),而不是程序的全部。变量的作用域与变量的生命周期有一定的联系, 如在一个函数中定义的变量, 这个变量的作用域从变量声明的时候开始到这个函数结束的时候。 这

2013-12-19 00:27:19 895

翻译 PHP里的opcode(2)

opcode是计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令规范指定。 除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数。 这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。通常opcode还有另一种称谓:字节码(byte codes)。 例如Java虚拟机(JVM),.NET的通用中间语言(CIL: Co

2013-12-19 00:06:42 923

翻译 操作码OpCode

运行一段PHP代码主要有两个阶段:编译和执行。 当然编译过程中还包括词法分析语法分析不同阶段和细节,这里我们将其作为一个整体。在这两个阶段之间,PHP代码会被编译成op code,可以将其认为是引擎的一个中间语言,编辑阶段把PHP源码生成op code,然后在执行阶段执行这些op code。PHP代码编译之后会生成许多的op,每一个op都是一个zend_op类型的c变量。相关的定义可以在{

2013-12-18 23:51:36 1929

原创 php中的全局变量

大家都知道PHP脚本在执行的时候用户全局变量(在用户空间显式定义的变量)会保存在一个HashTable数据类型的符号表(symbol_table)中, 在PHP中有一些比较特殊的全局变量例如: $_GET,$_POST,$_SERVER等变量,我们并没有在程序中定义这些变量,并且这些变量也同样保存在符号表中, 从这些表象我们不难得出结论:PHP是在脚本运行之前就将这些特殊的变量加入到了符号表中了。

2013-12-18 23:04:34 1073

翻译 php变量的创建

我们已经知道php变量在内核中其实是通过zval结构来实现的,也初步了如果设置一个zval结构的类型和值,这一节我们的目的便是在前两节的基础上,彻底掌握对zval结构的操控,其间将引入很多超棒的新的宏。在code的时候,我们很希望在内核中创建的zval可以让用户在PHP语言里以变量的形式使用,为了实现这个功能,我们首先要创建一个zval。最容易想到的办法便是创建一个zval指针,然后申请一

2013-12-18 22:59:07 688

原创 查找一段时间内日志

head -1 update.safe.my.iedun_log.20131217.txt123.122.180.129 - - [17/Dec/2013:00:00:19 +0800] "GET /index.php?s=2 HTTP/1.1" 404 570 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.

2013-12-18 12:58:56 1198

翻译 Zend内存管理器

在PHP里,我们可以定义字符串变量,比如 ,$str这个字符串变量可以被自由的修改与复制等。这一切在C语言里看起来都是不可能的事情,我们用#char *p = "hello";#来定义一个字符串,但它是常量,是不能被修改的,如果你用p[1]='c';来修改这个字符串会引发段错误(Gcc,c99),为了修改C语言里的字符串常量,我们往往需要定义字符串数组。为了得到一个能够让我们自由修改的字符串,我们

2013-12-18 00:49:38 1330

翻译 变量的值操作

PHP内核提供了三个基础宏来方便我们对变量的值进行操作,这几个宏同样以Z_开头,并且P结尾和PP结尾的同上一节中的宏一样,分别代表这参数是指针还是指针的指针。此外,为了进一步方便我们的工作,内核中针对具体的数据类型分别定义了相应的宏。如针对IS_BOOL型的BVAL组合(Z_BVAL、Z_BVAL_P、Z_BVAL_PP)和针对IS_DOUBLE的DVAL组合(Z_DVAL、ZDVAL_P、ZDV

2013-12-18 00:27:21 768

翻译 变量的类型

所有的编程语言都要提供一种数据的存储与检索机制,PHP也不例外。其它语言大都需要在使用变量之前先定义,并且它的类型也是无法再次改变的,而PHP却允许程序猿自由的使用变量而无须提前定义,甚至可以随时随意的对已存在的变量转换成其它任何PHP支持的数据类型。在程序在运行的时候,PHP还会自动的根据需求转换变量的类型。如果你用过PHP,肯定体验过PHP的弱类型的变量体系。众所周知,PHP引擎是用C

2013-12-18 00:24:17 966

翻译 变量的创建

我们已经知道php变量在内核中其实是通过zval结构来实现的,也初步了如果设置一个zval结构的类型和值,这一节我们的目的便是在前两节的基础上,彻底掌握对zval结构的操控,其间将引入很多超棒的新的宏。在code的时候,我们很希望在内核中创建的zval可以让用户在PHP语言里以变量的形式使用,为了实现这个功能,我们首先要创建一个zval。最容易想到的办法便是创建一个zval指针,然后申请一

2013-12-18 00:04:26 1036

原创 哈希碰撞攻击

哈希表碰撞攻击的基本原理哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表。PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结构存储)。理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值(key

2013-12-18 00:00:58 1865

原创 PHP哈希算法设计

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

2013-12-17 23:52:57 1002

原创 理解Zend里的哈希表

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

2013-12-17 23:45:26 933

原创 php中hashtable详解

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

2013-12-17 23:08:18 1593

原创 PHP的FastCGI

CGI全称是“通用网关接口”(Common Gateway Interface), 它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。 CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。FastCGI是Web服务器和处理程

2013-12-17 17:21:32 762

原创 php源代码解析:一次请求生命周期

我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的。PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口)。PHP总共有三个模块:内核、Zend引擎、以及扩展层。PHP内核用来处理请求、文件流、错误处理等相关操作;Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;扩展层是一组函数、类库和流,PH

2013-12-17 16:54:36 1004

原创 PHP源代码解析:一次请求的开始与结束

PHP开始执行以后会经过两个主要的阶段:处理请求之前的开始阶段请求之后的结束阶段开始阶段有两个过程:第一个过程是模块初始化阶段(MINIT), 在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中), 该过程只进行一次。第二个过程是模块激活阶段(RINIT),该过程发生在请求阶段, 例如通过url请求某个页面,则在每次请求之

2013-12-17 16:29:09 1422

原创 PHP源码分析之HashTable(2)

目录    1.前言    2.HashTable的总体结构及思路      2.1 哈希表的相关数据结构      2.2 哈希表的总体结构图      2.3 哈希表元素的析构    3.HashTable的相关API及算法    1.前言     看过PHP源码的童鞋都知道,源码里面除了zval这个最常用的结构外,另

2013-12-17 02:33:55 900

原创 PHP内核中的神器之HashTable

一、哈希表定义哈希表(或散列表),是将键名key按指定的散列函数HASH经过HASH(key)计算后映射到表中一个记录,而这个数组就是哈希表。这里的HASH指任意的函数,例如MD5、CRC32、SHA1或你自定义的函数实现。二、HashTable性能HashTable是一种查找性能极高的数据结构,在很多语言内部都实现了HashTable。理想情况下HashTable

2013-12-17 02:24:04 931

转载 PHP数据压缩、加解密(pack, unpack)

网络通信、文件存储中经常需要交换数据,为了减少网络通信流量、文件存储大小以及加密通信规则,经常需要对数据进行双向加解密以保证数据的安全。PHP中实现此功能主要需要使用的函数主要是pack及unpack函数pack压缩资料到位字符串之中。语法: string pack(string format, mixed [args]...);返回值: 字符串本函数用来将

2013-12-17 02:00:42 1667

原创 PHP资源类型

在PHP中,我们经常使用到资源类型变量。例如:mysql连接、文件句柄等。这些变量无法使用标量来表示,那么在Zend内核中是如何将PHP中的资源变量与C语言中的资源衔接的呢?一、资源变量在PHP中的使用[php] view plaincopy$fp = fopen("test.txt", "rw");

2013-12-17 01:56:56 1450

转载 通过VLD扩展分析PHP opcode

机器只能理解机器语言,而PHP作为解释型脚本到底是如何被机器执行的呢?实际上PHP在执行过程中,分为 词法分析、语法分析、编译PHP脚本为opcode,最后Zend引擎会执行这些opcode。在上述执行过程中,经常被人提起的解释型语言性能问题也就是因为每次执行脚本,上述过程都会重复执行。因此,也就出现了APC, xcache, eAccelerator等缓存opchode。

2013-12-17 01:54:05 968

原创 PHP中define常量的实现

在PHP中,常量的名字是一个简单的标识符,执行周期中不能改变,并且默认情况下是大小写敏感的。通常常量总是大写的。注:define中的第三个参数可以设置是否常量名大小写敏感一、常量的内部结构[cpp] view plaincopytypedef struct _zend_constant {      z

2013-12-17 01:52:02 1044

ganglia系统监控扩展

ganglia各种系统监控扩展脚本.欢迎前来下载使用.

2014-05-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除