文章报板
Posted on 2012-04-20 02:32 | By 肖良军, Under
Web前端
先做一个广告,“还在单身,赶快来爱吧网aiba.com”
最近开发头像上传功能,在用户上传图片后,把上传图片移动到临时文件,
picaddress=$uid.”jpg”;
页面效果:

图片在页面的显示代码:
<img src=”/attach/tmp/5454545.jpg” />
这个就遇到一个问题,如果用户上传一次头像感觉不好时会再次上传 就会出现总是上传的第一张图片,浏览器出现缓存!!
解决办法:
<img src=”/attach/tmp/5454545.jpg ?rand=随机码或时间搓” />
Posted on 2012-03-01 10:02 | By 肖良军, Under
算法+数据结构
编程就是一步一步的推理,运算符要很好的理解
下面四条语句在完成求值以后完全等同:
下面给出单目运算符:
| 运算符 |
名称 |
| ! |
逻辑非 |
| & |
取地址 |
| ~ |
求补 |
| * |
指针间接引用 |
| + |
单目加 |
| ++ |
增1 |
| - |
单目取反 |
| – |
减1 |
双目运算符
| 运算符 |
名称 |
| , |
逗号 |
| != |
不等 |
| % |
取模 |
| %= |
取模/赋值 |
| & |
按位和 |
| && |
逻辑和 |
| &= |
按位和/赋值 |
| * |
乘法 |
| *= |
乘法/赋值 |
| + |
加法 |
| += |
加法/赋值 |
| - |
减法 |
| -= |
减法/赋值 |
| -> |
成员选择 |
| ->* |
指向成员的指针选择 |
| / |
除法 |
| /= |
除法/赋值 |
| < |
小于 |
| << |
左移 |
| <<= |
左移/赋值 |
| <= |
小于等于 |
| = |
赋值 |
| == |
等于 |
| > |
大于 |
| >= |
大于/等于 |
| >> |
右移 |
| >>= |
右移/赋值 |
| ^ |
异或 |
| | |
按位或 |
| |= |
按位或/赋值 |
| || |
逻辑或 |
对每个运算符都进行练习,多阅读别人的好的代码
Posted on 2012-02-29 09:57 | By 肖良军, Under
算法+数据结构
平时用PHP都是出来一些文本文件,这些文件都是ASCII码,处理比较简单,最近有一个纯真IP地区的二进制文件,想用PHP全部读取出来,在存到mysql数据库里面。可以自己对二进制文件的是如何布局的不太熟,半路学计算机,基础不牢固。
1、计算机机器数据存储的只有0和1,
位: 二进制中,每个0或1都是一个位(bit),多个0和1就叫位序列;
字节: 8个位组织成一组,就叫字节;ASCII标准,每个字节表示一个字母,汉字由两个字节组成。
字: 在计算机中,一串数码作为一个整体来处理或运算的,称为一个计算机字,简称字。字通常分为若干个字节(每个字节一般是8位)。在存储器中,通常每个单元存储一个字,因此每个字都是可以寻址的。字的长度用位数来
字长: 计算机的每个字所包含的位数称为字长。根据计算机的不同,字长有固定的和可变的两种。固定字长,即字长度不论什么情况都是固定不变的;可变字长,则在一定范围内,其长度是可变的.
字符串: 如果“字符”是以ANSI编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为 ANSI 字符串或者多字节字符串。如,”中文123″ (占7字节)。
2、计算机数据数据

计算机数据实际存储_yetuwo.com
从图中可以理解:计算机数据的实际存储是包含:地址和值。地址就相当于我们在学校里面的学号,这是唯一,全校只有我一个有。值就是自己的名称了,可以有相同的名。所有在计算机中都通过地址寻找值。
Offset表示地址,这里显示的是16进制地址,顶部就是0~F的十六表示。这个图有点想数据里面的矩阵。
通过图可以知道,每个地址都映射一个值。这个值所表达的意思就要看它所对应的软件。
3、硬盘的实际结构

- 硬盘的实际结构_yetuwo.com
硬盘的结构主要有:
硬盘盘片(跟我们平时用的DVD光盘是一样的)读写磁头 传动手笔,传动抽,主轴,反力矩弹簧装置。

磁盘的内部结构_yetuwo.com
磁头: 是硬盘中最昂贵的部件,也是硬盘技术中最重要和最关键的一环。传统的磁头是读写合一的电磁感应式磁头,但是,硬盘的读、写却是两种截然不同的操作,为此,这种二合一磁头在设计时必须要同时兼顾到读/写两种特性,从而造成了硬盘设计上的局限。而MR磁头(Magnetoresistive heads),即磁阻磁头,采用的是分离式的磁头结构:写入磁头仍采用传统的磁感应磁头(MR磁头不能进行写操作),读取磁头则采用新型的MR磁头,即所谓的感应写、磁阻读。这样,在设计时就可以针对两者的不同特性分别进行优化,以得到最好的读/写性能。另外,MR磁头是通过阻值变化而不是电流变化去感应信号幅度,因而对信号变化相当敏感,读取数据的准确性也相应提高。而且由于读取的信号幅度与磁道宽度无关,故磁道可以做得很窄,从而提高了盘片密度,达到200MB/英寸2,而使用传统的磁头只能达到20MB/英寸2,这也是MR磁头被广泛应用的最主要原因。目前,MR磁头已得到广泛应用,而采用多层结构和磁阻效应更好的材料制作的GMR磁头(Giant Magnetoresistive heads)也逐渐普及。
磁道 当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。这些磁道用肉眼是根本看不到的,因为它们仅是盘面上以特殊方式磁化了的一些磁化区,磁盘上的信息便是沿着这样的轨道存放的。相邻磁道之间并不是紧挨着的,这是因为磁化单元相隔太近时磁性会相互产生影响,同时也为磁头的读写带来困难。一张1.44MB的3.5英寸软盘,一面有80个磁道,而硬盘上的磁道密度则远远大于此值,通常一面有成千上万个磁道。
扇区 磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区可以存放512个字节的信息,磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位。1.44MB3.5英寸的软盘,每个磁道分为18个扇区。
柱面 硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘单面上的磁道数是相等的。无论是双盘面还是单盘面,由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。所谓硬盘的CHS,即Cylinder(柱面)、Head(磁头)、Sector(扇区),只要知道了硬盘的CHS的数目,即可确定硬盘的容量,硬盘的容量=柱面数*磁头数*扇区数*512B。
Posted on 2012-02-28 23:55 | By 肖良军, Under
PHP
PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们平时开发扩展, 修复PHP的bug的时候, 却对这一部分的知识需要有一个良好的理解.
Zend Memory Manager, 以下简称Zend MM, 是PHP中内存管理的逻辑. 其中有一个关键数据结构: zend_mm_heap:

Zend MM把内存非为小块内存和大块内存俩种, 区别对待, 对于小块内存, 这部分是最最常用的, 所以追求高性能. 而对于大块内存, 则追求的是稳妥, 尽量避免内存浪费.
所以, 对于小块内存, PHP还引入了cache机制:

PHP cache机制_yeuwo.com
Zend MM 希望通过cache尽量做到, 一次定位就能查找分配.
而一个不容易看懂的点是free_buckets的申明:
Q: 为什么free_buckets数组的长度是ZEND_MM_NUMBER_BUCKET个?
A: 这是因为, PHP在这处使用了一个技巧, 用一个定长的数组来存储ZEND_MM_NUMBER_BUCKET个zend_mm_free_block, 如上图中红色框所示. 对于一个没有被使用的free_buckets的元素, 唯一有用的数据结构就是next_free_block和prev_free_block, 所以, 为了节省内存, PHP并没有分配ZEND_MM_NUMBER_BUCKET * sizeof(zend_mm_free_block)大小的内存, 而只是用了ZEND_MM_NUMBER_BUCKET * (sizeof(*next_free_block) + sizeof(*prev_free_block))大小的内存..
我们来看ZEND_MM_SMALL_FREE_BUCKET宏的定义:
- #define ZEND_MM_SMALL_FREE_BUCKET(heap, index) \ (zend_mm_free_block*) ((char*)&heap->free_buckets[index * 2] + \ sizeof(zend_mm_free_block*) * 2 - \ sizeof(zend_mm_small_free_block))
之后, Zend MM 保证只会使用prev和next俩个指针, 所以不会造成内存读错..
那么, 第二个不容易看懂的点, 就是PHP对large_free_buckets的管理, 先介绍分配(TIPI项目组对此部分的描述有些含糊不清):
- static zend_mm_free_block *zend_mm_search_large_block(zend_mm_heap *heap, size_t true_size) large_free_buckets
可以说是一个建树和双向列表的结合:
large_free_buckets使用一个宏来决定某个大小的内存, 落在什么index上:
- #define ZEND_MM_LARGE_BUCKET_INDEX(S) zend_mm_high_bit(S)
zend_mm_high_bit获取true_size中最高位1的序号(zend_mm_high_bit), 对应的汇编指令是bsr(此处, TIPI项目错误的说明为: “这个hash函数用来计算size的位数,返回值为size二进码中1的个数-1″).
也就是说, 每一个在large_free_buckets中的元素, 都保持着指向一个大小为在对应index处为1的size的内存块的指针. 诶, 有点绕口, 举个例子:
比如对于large_free_buckets[2], 就只会保存, 大小在0b1000到0b1111大小的内存. 再比如: large_free_buckets[6], 就保存着大小为0b10000000到0b11111111大小的内存的指针.
这样, 再分配内存的时候, Zend MM就可以快速定位到最可能适合的区域来查找. 提高性能.
而, 每一个元素又同时是一个双向列表, 保持着同样size的内存块, 而左右孩子(child[0]和child[1])分别代表着键值0和1, 这个键值是指什么呢?
我们来举个例子, 比如我向PHP申请一个true_size为0b11010大小的内存, 经过一番步骤以后, 没有找到合适的内存, PHP进入了zend_mm_search_large_block的逻辑来在large_free_buckets中寻找合适的内存:

PHP内存选择_yetuwo.com
1. 首先, 计算true_size对应的index, 计算方法如之前描述的ZEND_MM_LARGE_BUCKET_INDEX
2. 然后在一个位图结构中, 判断是否存在一个大于true_size的可用内存已经存在于large_free_buckets, 如果不存在就返回:
- size_t bitmap = heap->large_free_bitmap >> index;
- if (bitmap == 0)
- { return NULL; }
3. 判断, free_buckets[index]是否存在可用的内存:
- if (UNEXPECTED((bitmap & 1) != 0))
4. 如果存在, 则从free_buckets[index]开始, 寻找最合适的内存, 步骤如下:
4.1. 从free_buckets[index]开始, 如果free_buckets[index]当前的内存大小和true_size相等, 则寻找结束, 成功返回.
4.2. 查看true_size对应index后(true_size < < (ZEND_MM_NUM_BUCKETS - index))的当前最高位, 如果为1. 则在free_buckets[index]->child[1]下面继续寻找, 如果free_buckets[index]->child[1]不存在, 则跳出. 如果true_size的当前最高位为0, 则在free_buckets[index]->child[0]下面继续寻找, 如果free_buckets[index]->child[0]不存在, 则在free_buckets[index]->child[1]下面寻找最小内存(因为此时可以保证, 在free_buckets[index]->child[1]下面的内存都是大于true_size的)
4.3. 出发点变更为2中所述的child, 左移一位ture_size.
5. 如果上述逻辑并没有找到合适的内存, 则寻找最小的”大块内存”:
- /* Search for smallest "large" free block */
- best_fit = p = heap->large_free_buckets[index + zend_mm_low_bit(bitmap)];
- while ((p = p->child[p->child[0] != NULL]))
- {
- if (ZEND_MM_FREE_BLOCK_SIZE(p) > ZEND_MM_FREE_BLOCK_SIZE(best_fit))
- {
- best_fit = p;
- } }
注意上面的逻辑, (p = p->child[p->child[0] != NULL]), PHP在尽量寻找最小的内存.
为什么说, large_free_buckets是个键树呢, 从上面的逻辑我们可以看出, PHP把一个size, 按照二进制的0,1做键, 把内存大小信息反应到了键树上, 方便了快速查找.
另外, 还有一个rest_buckets, 这个结构是个双向列表, 用来保存一些PHP分配后剩下的内存, 避免无意义的把剩余内存插入free_buckets带来的性能问题(此处, TIPI项目错误的描述为: “这是一个只有两个元素的数组。 而我们常用的插入和查找操作是针对第一个元素,
即heap->rest_buckets[0]“).
注:http://www.laruence.com/2011/11/09/2277.html
Posted on 2012-02-27 04:23 | By 肖良军, Under
PHP,
算法+数据结构
找来一堆几千万条数据,要提取里面的邮箱,并且每10万条为一个文本。
代码:

执行结果:

可以看出整理10万条数据,差不多要一分钟(文件的创建时间-修改时间)。自己整理里出95个文件,耗时1个多小时。
代码修改:
- < ?php
- $fp=fopen("renren/1_1.txt",'r');
- $fp2=fopen("renren_new/1.txt",'a');
- $num=1;
- $page=1;
- while(!feof($fp))
- {
- $renrenemail=trim(fgets($fp));
- $renrenemail_array=explode(' ',$renrenemail);
- $email=trim($renrenemail_array[0]);
- fputs($fp2,$email."\n");
- if($num==100000)
- {
- $num=0;
- $page++;
- fclose($fp2);
- $fp2=fopen("renren_new/{$page}.txt",'a');
- }
- $num++;
- }
- fclose($fp2);
- fclose($fp);
- ?>
执行结果:

可以看出整理10万条数据,差不多要2秒(文件的创建时间-修改时间)。
所以代码一定要不定的斟酌。
Posted on 2012-02-26 08:51 | By 肖良军, Under
English
李阳:学习英语的十大建议。依旧很疯狂的建议,大家“择善取之”。

YOU are responsible for your own learning!
你应该对自己的学习负责任!
YOU must seek out the best materials!
你应该自己寻找最好的学习材料!
YOU cannot say you have no environment!
你不能说你没有语言环境!
STOP using the Internet to chat and play games!
不要再用网络来聊天和打游戏了!
Make the Internet your high-level English textbook!
让网络成为你的高水平英语课本!
既然提出大学应该取消英语课本,那么到底如何才能成为英语这本语言的主人?
下面给那些没有毕业和已经毕业的亿万大学生提出“十条建议”:
第一、坚决拒绝做任何选择题!一个少林寺高僧是通过“陈年累月的刻苦修行”才成功的,绝对不是靠做十年“武术选择题”成功的!把考试题脱口而出,你就可以一举两得:讲一口流利的英语,顺便高考分!
第二、不再“急功近利”背诵单词!我一见到大学生拿着单词书背,我就烦!有用吗?背完就忘,背了也不会用,也不能用,因为根本没有“读准”!希望从今天开始,用“反复操练读准单词”来代替无聊、无效的背诵单词!让孤立背单词见鬼去吧!
第三、不再以四、六级大纲为背诵单词的标准!“随身准备”一个单词本,将阅读中出现的所有单词都抄写下来!只要是美国主流社会使用的单词,我们的大学生都应该掌握!不要再谈论什么“超纲不超纲”了!大纲内的要掌握,大纲外的更要掌握!
第四、不要再为语法烦恼!只要记住主语、谓语、宾语、宾语补足语这四个最重要的组成部分就可以了!只有大量的朗读、背诵、阅读,才能“把语法转化成语感”!
第五、把坚持朗读英语变成自己的“每日必须做的事情”,当成是对自己意志的锻造,而不是崇洋媚外!我希望中国的大学到处都是英语和汉语的朗朗读书声!这是社会主义国家校园最喜人的景象!
第六、了解世界、增长智慧应该成为学习英语的主旨!学习英语、研究英语、欣赏英语应该成为“顺便的事情”!千万不要一辈子学英语,却不能使用英语!这是对生命最大的浪费!
第七、坚决反对中国人和亚洲人所谓的“英语情结”!坚决反对为了学习英语而放弃其它的方面的自我改造!人生不仅是英语!英语只不过是一个工具!
第八、“中英文”一定要同时进步!建议大家朗读《青年文摘》!疯狂英语的信念是:精通汉语,顺便学好英语!我每天都在坚持朗读优美、实用的汉语文章!我之所以成为中国最贵的翻译,我之所以翻译的时候不做笔记,就是因为我“不断提高的”汉语水平!
第九、爱国就是承认自己的弱点,爱国就是虚心向别人学习,爱国就是讲一口流利的英语!爱国就是刻苦学习!爱国就是每天早上坚持“疯狂读英语”!
第十、“学习的速度”就是成功的速度,而阅读的速度就是学习的速度!一定要坚持“每天大量阅读”,这是人生“全面成功”的核心要素!每天无论多么劳累,我都要坚持阅读一个小时!
Posted on 2012-02-26 08:38 | By 肖良军, Under
PHP
PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写。PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用。本文总结了PHP日常开发中常用的8个小技巧。
1、命名
- <input type='checkbox' name='checkbox[]' value=$dwmyrow[banzhu] />
2、使用
当计划当作sql指令的一部分时:如果参与控制的字段是数值型的,则
- if(! emptyempty($_POST['checkbox'])) {
-
- $expr = join(",", $_POST['checkbox']);
-
- $sql = "select * from tbl_name where field in ($expr)";
-
- }
如果参与控制的字段是数值型的,则
- if(! emptyempty($_POST['checkbox'])) {
-
- $expr = "'".join("','", $_POST['checkbox']).".";
-
- $sql = "select * from tbl_name where field in ($expr)";
-
- }
PHP判断Form表单是否提交
- $action=$HTTP_POST_VARS["Button1"];
-
- if($action=="提交")
-
- {
-
- //执行表单操作
-
- }
-
- else
-
- {
-
- //读取默认值
-
- }
PHP 获取字符串长度
- strlen($myrow[1])
-
- <strong>PHP Url转向</strong>
-
- Header("Location: ".$_SERVER["HTTP_REFERER"]);
-
- <strong>PHP超全局对象</strong>
-
- < ?php
-
- $a = 1;
-
- $b = 2;
-
- function Sum()
-
- {
-
- $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
-
- }
-
- Sum();
-
- echo $b;
-
- ?>;
- ?>
PHP 表单取值
如果 mothod=”get” 就用 $_GET["test"] 代替$test
如果 mothod=”post” 就用 $_POST["test"] 代替$test
PHP取得当前IP
- < ?=$HTTP_SERVER_VARS["REMOTE_ADDR"]?>
- PHP 取得当前时间
- < ?php echo date("Y-m-d G:i:s"); ?>
- date("Y年m月d日") Date ("Y-n-j")
- ?>
Posted on 2012-02-26 08:22 | By 肖良军, Under
Linux/Ubuntu,
PHP,
服务器端
PHP底层工作原理
图1 php结构

PHP底层工作原理
从图上可以看出,php从下到上是一个4层体系
①Zend引擎
Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。
②Extensions
围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。
③Sapi
Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍
④上层应用
这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。
构架思想:
引擎(Zend)+组件(ext)的模式降低内部耦合
中间层(sapi)隔绝web server和php
**************************************************************************
如果php是一辆车,那么
车的框架就是php本身
Zend是车的引擎(发动机)
Ext下面的各种组件就是车的轮子
Sapi可以看做是公路,车可以跑在不同类型的公路上
而一次php程序的执行就是汽车跑在公路上。
因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道
Apache和php的关系

Apache和php的关系
Apache对于php的解析,就是通过众多Module中的php Module来完成的。
把php最终集成到Apache系统中,还需要对Apache进行一些必要的设置。这里,我们就以php的mod_php5 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。
假定我们安装的版本是Apache2 和 Php5,那么需要编辑Apache的主配置文件http.conf,在其中加入下面的几行内容:
Unix/Linux环境下:
LoadModule php5_module modules/mod_php5.so
AddType application/x-httpd-php .php
注:其中modules/mod_php5.so 是X系统环境下mod_php5.so文件的安装位置。
Windows环境下:
LoadModule php5_module d:/php/php5apache2.dll
AddType application/x-httpd-php .php
注:其中d:/php/php5apache2.dll 是在Windows环境下php5apache2.dll文件的安装位置。
这两项配置就是告诉Apache Server,以后收到的Url用户请求,凡是以php作为后缀,就需要调用php5_module模块(mod_php5.so/ php5apache2.dll)进行处理。
Apache的生命周期

Apache的生命周期
Apach的请求处理流程

Apach的请求处理流程
Apache请求处理循环详解
Apache请求处理循环的11个阶段都做了哪些事情呢?
1、Post-Read-Request阶段
在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。
2、URI Translation阶段
Apache在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。
3、Header Parsing阶段
Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。
4、Access Control阶段
Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。
5、Authentication阶段
Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。
6、Authorization阶段
Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。
7、MIME Type Checking阶段
Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。
8、FixUp阶段
这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。
9、Response阶段
Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。
10、Logging阶段
Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。
11、CleanUp阶段
Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。
LAMP架构:

LAMP架构:
从下往上四层:
①liunx 属于操作系统的底层
②apache服务器,属于次服务器,沟通linux和PHP
③php:属于服务端编程语言,通过php_module 模块 和apache关联
④mysql和其他web服务:属于应用服务,通过PHP的Extensions外 挂模块和mysql关联
注:http://www.cnblogs.com/phphuaibei/archive/2011/09/13/2174927.html