关注LAMP|PHP源代码分析|web架构|PHP扩展|Erlang|服务端架构

PHP源代码分析之HashTable

PHPzval结构体可以看出PHP使用HashTable来保存数组信息,PHP的HashTable使用了一些技巧,这些技巧是PHP高效数组操作的直接原因,源代码在PHP源代码目录的Zend/zend_hash.h  Zend/zend_hash.c 中。先来看看Zend HashTable的定义:

继续阅读 »

PHP源代码分析资料收集

在PHP源代码分析的过程参考了不少优秀的相关资料,而很多资料由于各种原因在网上慢慢的就找不到了(例如www.phpinternals.com 这个网站是有不少优秀的文章可以参考,但最近才发现blog已经关闭了),所以就把一些资料罗列出来给大家。

版权信息在文件里面都已经包含了,我就不重复了。

PDFs:

 1  the-php-life-cycle     讲解PHP生命周期的,web server以Apache为例

2. Sams.Extending.and.Embedding.PHP.May.2006   这个不用说了,经典!

3. sara_golemon-tutorial_extension_writing  包括的内容非常广

4. php_extension_writing     (OSCON 2007上的PPT

  SITEs:

1. http://cn.php.net/manual/en/internals2.php  PHP core

2. http://devzone.zend.com/tag/Extension 

3. http://www.yanbin.org/  抚琴居

4. http://www.laruence.com/  风雪之隅

有优秀的资料,麻烦跟我推荐一下

PHP源代码分析之变量

PHP中所有变量都使用zval结构体来存放:

 

PHP中可以使用函数 debug_zval_dump($var)查看变量的引用信息。

 相对于PHP的内核而已,我们编写的PHP代码都属于“用户空间”(user space),用户空间中的任何PHP变量都是由两部分组成:变量名(label)和变量值,从上面已经看到变量值存放在zval结构体中,那么变量名是放在哪里的呢? 下篇将继续分析PHP的HashTable结构体。

说明:本文中的图片均截自Marcus BörgerWez, FurlongSara, Golemon 三人的PHP ENTENSION WRITING (OSCON 2007)

PHP 5.2.6中源码稍有不同,不过含义一样,无关大雅。

 

refcount用来表示有多少个变量指向本结构体,is_ref用来标示是否是引用。看两个例子:

$a = 5;

$b = $a;

$b = 10;

 

$a = 5   =>  value.lval = 5, refcount = 1, type = IS_LONG, is_ref = 0

$b = $a  =>  value.lval = 5, refcount = 2, type = IS_LONG, is_ref = 0

$b = 10  =>  1  value.lval = 5, refcount = 1, type = IS_LONG, is_ref = 0   $a

             2  value.lval = 10, refcount = 1, type = IS_LONG, is_ref = 0   $b

 

在第三步时,PHP又产生了一个新的结构体用于保存变量$b, 原因在于原来$b指向的结构体的is_ref 成员的值为0. 这就是PHPCopy on Write机制。

 

再看下一种情况:

 

$a = 123;

$b = &$a;

$b = 456;

 

则按下图保存

PHP源代码分析之PHP生命周期

无论PHP通过何种方式启动,其初始化、响应单个请求、代码编译运行、结束请求、卸载过程都是相同的。

 

1.进程初始化

在模块的MINIT过程中可以添加你自定义的常量、变量、类、资源、流以及Filter句柄等等。

2.接受请求

 

3.解析编译运行代码

Zend Engine首先将代码编译成Zend Opcode,然后再使用Zend虚拟机来解释执行。

4.请求结束

5.进程退出

 

 

Linux之路 — SSH篇

       需要的windows软件:SecureCRT,WinSCP

一、前言

        即使Linux本身的安全性已经相当好,我们仍然需要在实际操作中关注某些安全要点。目前大部分的Linux管理都采用远程控制来进行,如果保证远程控制中数据的安全是一个合格的linux管理员必须熟悉的技能。

        各种黑客行为、尝试给我们的网络带来了大量的破坏,但不可否认这些行为和尝试也给计算机安全带来了极大的促进。从理论上来说,网络传输中任何对称加密算法都是不安全的,所以我们在日常的linux管理中应该采用非对称加密算法来进行权限验证。SSH是一种加密传输数据的方式(不同于telnet等的明文数据传输),是目前最通用的linux远程安全控制方案,它提供两种认证方式:密码认证和密匙认证。关于非对称加密的相关知识请看 http://baike.baidu.com/view/554866.htm 

       本文以Centos 5.3 为例并假设你已经有一个安装好的Linux主机或者虚拟机,我这里采用的是虚拟机。 继续阅读 »

Linux之路 — 工具准备篇:SecureCRT配色显示

SecureCRT的配置功能非常强大,可以完全的显示Linux下的颜色显示。设置如下:

会话设置

选择Xterm

选择颜色方案

 

全局配置

修改颜色,文件目录和文件中注释默认显示为深蓝色,看起来相当的吃力

我选择修改为兰色,你可以根据自己的喜好修改

链接终端, # vim /etc/ssh/sshd_config

vim 下键入syntax enable,打开语法着色功能。效果如下:

如果没有显示出颜色,而且你确认你的终端支持颜色显示,请先退出VIM,输入如下命令:

TERM=xterm-color; export TREM

用于告诉VIM你的终端是支持颜色显示的。最后,祝你有个愉快的Linux之旅。

 

 

Centos 5下默认网关设置

Centos/Fedora下都有多种方法可以设置默认网关,即使是配置文件也有多处。以前感觉的是方便,今天感觉却是郁闷。描述一下情况:

本地虚拟机中安装了个Centos 5.2,安装过程填网关时输错,之后虚拟机中一直无法ping通外部网络,通过route add default gw 192.168.159.2命令添加后可ping通,但是重启后失效。之后直接写配置文件/etc/sysconfig/network,添加 GATEWAY 192.168.158.2,但是奇怪的是依然无法ping通(网络服务、机器均重启)。 没办法只好直接在/etc/sysconfig/network-scripts/ifcfg-eth0中添加GATEWAY 192.168.158.2,重启,OK!

猜测是其他地方的配置文件设置的依然是错误的网关配置,而且优先级大于/etc/sysconfig/network中的配置。但是没有找到这个文件,有知道的麻烦指点一下。

su后“不能”使用某些超级命令的解决

一个基础问题而已。从普通用户使用su之后,某些命令无法使用,如:

bash: usermod: command not found

命令存在,也有了root权限,为何提示“命令找不到”,想一想就明白了是环境变量的问题(PATH)。man su,第一个参数告诉了我们真相。

-, -l, –login
              make the shell a login shell

使用这个选项用于在su的同时(成功的情况下)更换到对应用户的shell,也就是说正常情况下,我们su之后只是获得了root权限,但是shell还是之前的普通权限用户的shell,而普通用户shell的PATH通常是没有/usr/sbin等目录的。解决方法:

1.添加这些超级工具目录到PATH

2.使用su – 来切换到root权限

3.使用命令的完全路径,如/usr/sbin/usermod

Pages: 1 2 下一页
返回顶部