一、网络协议基础

(一)tcp三次握手

第一次握手:发送请求连接包给服务器。客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到请求连接后,返回一个可以连接的应答包。服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到应答包后再向服务器端发送收到应答包的确认包。客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。


(二)socket

程序通过socket进行通信。作为进程通信机制,用于描述IP地址,端口,是一个通信链的句柄。sochet实际上是对tcp/ip协议的封装,socket本身不是协议,而是一个调用接口(API)
通过Socket,我们才能使用TCP/IP协议。TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
socket函数接口:,比如create、listen、connect、accept、send、read和write等等。


套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

  1、服务器监听:服务器生成一个监听socket,实时监听来访socket。服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

  2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。

  为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

  3、连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程(一个新的socket),把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。

  而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。


三、http协议

1、HTTP/0.9 的特性
只支持html标签,只支持纯文本内容。
只有GET一个方法,能请求简单的页面。

2、http/1.0 特性
除支持html标签以外,引入了MIME,可以传纯文本以外的内容;
增加了七个方法,从而增强了访问服务器的方式,使动态网页访问方式更多。
(1)MIME
MIME:multipurpose Internet Mail Extension ,多用途互联网邮件扩展。
在传输前,把非文本数据重新编码为文本格式,接收方用相反的方式将其重新还原为原来的格式,还能调用相应的程序打开此文件。

smtp(简单邮件传输协议): 只能传输纯文本邮件。
     在smtp中引入了MIME后可以传输多种文件了。如图像、视频等。


将MIME引入到http当中,所以现在的网页可以传输丰富的文件。

客户端浏览器向web服务器请求数据--》服务器收到请求把响应的文件组织成一个Html文件传给客户端时,都在前面加了格式类型(如 p_w_picpath/jpg)--》客户端览器收到服务器传回来的html页面时,会利用浏览器中的相应的插件来打开此html页面中包含的文件并展示出来(现在浏览器可以解析几百种文件格式。如果没有这种文件的插件就无法打开,如flash,就需要手工安装插件)

(2) http/1.0的几个方法:
GET:从服务器获取资源到本地
POST:提交
head:
PUT:
DELETE:远程从服务器端删除某文件。
trace:
options
connection

(3)动态网页的执行过程:

服务器端存储的文档非Html格式,而是编程语言开发的脚本。服务器端脚本接受参数之后(客户端通过get方法或post方法把参数传递到服务器)在服务器运行一次,运行完成之后生成的html格式文档,再把生成的Html文档发给客户端。

动态网页包含动态网页和静态网页。


3、http/1.1
在http/1.1的基础上增加了以下两项功能:
(1)增强了缓存的功能
(2)长连接机制

在http1.0中,一次连接只能作一次http请求,即请求一次,连接一次,请求完成立即断开连接。
http1.1以后,可进行长连接,即可以一次连接多次请求,即请求连接后就不断开,后续请求直接传送。
如果用在请求不是很大的环境中可以很大的提升访问性能,但在访问量大的请况下不建议开启此功能。

4、http报文
(1)请求报文:
<method><request-url><version>   //资源获取方法,请求的资源是什么,协议版本号
<headers>        //头部
                //空白行,一定要的
<entiy-body>   //报文主体

(2)响应报文:
<version><status><reason-phrase>  //响应协议版本,状态代码,状态码解释。
<headers>        //头部
                //空白行
<entiy-body>     //响应报文体

状态码:
1xx:纯信息。
2xx:“成功”类的信息。    200,请求资源正常。
3xx:重定向类的信息。      301,永久重定向; 302,临时重定向; 304,没有发生改变。
4xx:客户端错误类信息。   404,请求了一个不存在的文件;
5xx:服务器端错误类的信息。

例:
请求报文:
GET  /2.html  HTTP/1.1  //GET方法/×××器根文件夹下2.html的内容,为空就是默认网页/协议版本1.1
Host:www.loready.cn
connection:keep-alive    //上两行都是头部,主机名是loready,连接类型是长连接。

响应报文:
HTTP/1.1  200   OK  //版本号是1.1  /200状态码,即正常/ok即成功。

5、web服务器的主要操作:

建立连接:接受巨型拒绝客户端连接请求。
接收请求:通过网络读取HTTP请求报文。
处理请求:解析请求报文并做出相应的动作。
访问资源:访问请求报文中相应的资源
构建响应:使用正确的首部生成http响应报文
发送响应:向客户端发送 生成的报文。
记录日志:完成传输后记录进日志。


二、apache

(一)安装

1、rpm安装:略

2、编译安装

(1)先安装mysql
(2)编译安装apr1.4以上版本,且不能卸载老的版本以防其他软件对老版本的依赖,所以只能装到不同的路径下。编译安装完即可,其他不用设定。
apr :Apache Portable Run-time Librarie (apache的可移植运行库),我们都知道apache有很多版本,比如说w32的版本,network的版本等多种操作系统平台的版本,
那么这么多的版本apache官方是不是每个操作系统平台都要新开发一个版本呢?,这个对apache官方来说不是什么难事,而对于那些开发模块的人来说,我开发一个新功能到底是跑在linux版本的apache还是跑在windows版本的apache呢?那么对于开发模块的那些人是不是也要开发不同操作系统的模块,这样岂不是很苦恼的一个事情,那么有了apr以后,对于应用程序而言.它们根本就不需要考虑具体的平台,不管是Unix .Linux还是Window的,apr类似java虚拟机,让apache跑在apr上.这样一来就方便多了.

      #cd /usr/local/src
      #tar zxvf  apr-1.4.6.tar.gz
      #cd apr-1.4.6
      #./configure --prefix=/usr/local/apr
     # make
      #make install

(3)编译安装和apr-util(工具集)。在编译时要指定apr的安装位置,./configure时需加上  --with-apr="apr路径"

     #cd /usr/local/src
     #tar zxvf apr-util-1.4.1.tar.gz
     #cd apr-util-1.4.1
     #./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr或--with-apr=/usr/local/apr/bin/apr-1-config
     #make
     #make install

(4)编译安装httpd2.4以上版本。
先安装 openssl-devel和pcre-devel解决依赖关系。
  .configure/选项:

 ./configure --prefix=/usr/local/apache(安装目录) --enable-so --enable-ssl --enable-cgi --enable-cgid --enable-rewrite --with-ssl --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util(指定apr和apr-uitl路径)      

(二)安装文件详解:

1、rpm包安装后的文件
httpd: selinux事先要让处理permssive或disabled)

httpd安装后的目录和进程:
     /usr/sbin/httpd
     httpd:root,root (主导进程)
     httpd:apche,apache(工作进程 )
/etc/rc.d/init.d/httpd  (服务脚本)
/etc/httpd   :工作目录,相当于程序安装目录
/etc/httpd/conf   配置文件目录
      主配置文件:http.conf
      /etc/httpd/conf.d/目录下的所有.conf文件,均为主配置文件的组成部分。因为主配置文件较大,采用分段配置。
/etc/httpd/modules:模块链接,文件不存在此,只是做了软链接


/etc/httpd/logs  也是软链接,是日志文件。分为访问日志和错误日志。

/var/www/html      网站静态页面存放目录
/var/www/cgi-bin   网站动态页面存放目录


2、编译安装后的文件
/bin 下的 apachectl是启动程序。

(三)环境配置
1、把二进制目录导入PATH环境变量
export httpd_home=/usr/local/apache2/bin
export PATH=$PATH:httpd_home

2、增加自启动

cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd    //把apache加入到系统启动
vi /etc/init.d/httpd                                        //编辑httpd脚本,加入两行
在#!/bin/sh下面添加以下两行
#chkconfig:2345 10 90
#description:Activates/Deactivates Apache Web Server

3、chkconfig --add httpd                               //把httpd加入到启动脚本中。一定要先在脚本中加入前面两行才可以。

(四)apache工作机制:
1、处理响应过程:
httpd不处理动态web内容,是通过某种协议调用额外的程序来运行,并把运行后的结果取回,再返回给客户。
CGI:通用网关接口,就是让web服务器与其他应用程序打交道的协议。可通过CGI通信的程序有,php,java(jsp),perl 等等,都是httpd通过CGI把请求发给相关动态页面处理程序,并从动态页面处理程序处拿到处理结果,再传给hpttd,httpd将拿回的结果与自已的页面统一整合后,发给客户端。

用户--->httpd(index.cgi)--->spawn process(处理index.cgi)并把结果传给   -->httpd -->client
 web服务器(如HTTPD)与动态处理程序服务器(如PHP服务器,perl服务器,jsp服务器 等)可以是分开的。web服务器只处理静态页面,动态页面处理程序专处理动态页面。

2、响应模式

MPM:

    prefork 一个请求用一个进程响应,这个是默认。即来一个请求就开一个进程专门响应,并发响应多个请求,所以会同时开启很多个进程。
    worker  一个请求用一个线程响应。启动多个进程,每个进程生成多个线程,多个线程共享一个进程。
    event   一个进程处理多个请求(2.4以上才支持)

/etc/sysconfig/http更改响应模式。

(四)httpd配置文件:

分三段:
--------------------------------------------------------------------------------------------------------
1、全局配置


serverRoot  "/etc/httpd"     //服务器配置文件及日志文件位置
pidfile run/httpd.pid        //用来指定http.pid的位置。此文件记录httpd进程的ID,即进程号。httpd能自动复制其自身。因此系统中有多个httpd进程。但只有一个是初始末进程。即父进程。此处指定的文件就是记录http的父进程号。
timeout 120                  //指定客户端与服务器连接超时的时间间隔。超过这个时间服务器没响应,就断开连接。

#长连接配置
keep alive off               //长连接机制。Off是不使用长连接机制。长连接的工作原理在http1.1中有详解。
maxkeepalive requests  100   //如开启长连接机制,每一次连接可提出的请求数,即一次长连接可以接受最多多少个请求数,达到这个数就会中断连接,后续请求会重新连接。设为0时,为不限制
keepalive timeout     15    //一次连接多次请求之间的间隔时间。如果一次连接后,在完成一次请求后,在这个间隔时间之内,没有收到下一个请求就中断连接。以秒为单位。即两次请求的最大时间间隔。超过就中断连接。



#prefork模块,一个请求用一个进程响应,这个是默认。即来一个请求就开一个进程专门响应,并发响应多个请求,所以会同时开启很多个进程。
<IFModule  prefork.c>
min spareserver 5         //最小空闲进程数。即最少要有5个进程是空闲的。
max spareservers  20      //最大空闲进程数。在使用子进程处理http请求的web服务器上,要先生成子进程才能处理客户端的请求,因此反应会有一点延迟。但是apache服务器预先生成多个空余的子进程驻留在系统中,一旦出现请求就用这些空余的进程进行处理,就可以摆脱这种生成子进程造成的延迟现象。
                           但随着请求越来越多,子进程会越开越多,并且完成请求后,打开了的子进程就不会自动退出,等待下个请求。但是这样子进程只增加不减少,占用服务器资源。所以设置一个空闲子进程上限。当空闲子进程超过上限数时,会自动关掉一些空闲子进程, 降到最大空闲进程数之下。
                            min spareservers 是设定空闲子进程不得少于这个数。  max spareservers 是指最大子进程数,超过的就关掉。
startserver   8           //httpd启动时开启的进程数。这个参数应设为上面的 min 和max 之间的一个数。不然就没有意义了。
serverlimit  256          // 默认最大连接只有256,所以为了加大客户并发连接数,就需要此处定义。最大为20000。要更改此数,要先关掉Http服务,然后更改,再启动才行,不能先改再重启,那样不会生效。
maxclients   256          //设置最大并发连接此服务器的客户数。限制同时连接此服务器的客户数目。
maxrequstperchild  1000   //每个进程处理一定次数的请求后,就退出此进程,重新生成一个干净的进程。此处为一个进程处理1000次请求后就关掉,重新生成一个干净的进程。设为0的话,一个进程可以无限制处理请求的次数。

</IFModule>



# worker模块,这个模块支持全新的多线程和多进程混合模型的MPM,即一个请求用一个线程响应。启动多个进程,每个进程生成多个线程,多个线程共享一个进程。。编译安装时,加上configure --with-mpm=worker即可。
<IfModule worker.c>
StartServers 2            //开启Http时启动的进程数。是进程,进程中生成多个线程来处理请求。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。
MaxClients 150            //最多用户请求数。
MinSpareThreads 25        //最小空闲线程数,是指所有进程中的所有空闲的线程数的总和,不是指单个进程的空闲进程数。
MaxSpareThreads 75        //最大空闲线程
ThreadsPerChild 25        //每个进程最多可以生成的线程数。ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。
                            这时要显式使用ThreadLimit指令,它的最大缺省值是20000。Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。
MaxRequestsPerChild 0     //每一个进程响应多少个请求。0不做限定。
</IfModule>



#端口设定
listen  80   //设置服务器的监听端口,和客户端的请求的IP地址(服务器的IP地址)。   可以重启一行,设置多个端口,但建议为默认的。

#加载模块
loadmodule   //为服务器启动时的动态加载模块。httpd是模块是动态加载的,可以手工添加需要加载的模块。


#Include conf.d/*.conf   //设定子配置文件目录。即此文件下的.conf文件都会包含进来。



user apache
group apache   //设置httpd运行后,权限所属为此处定义的用户和组。是Apache的安全保证。默认是apache帐号和组。此选项只在standalone模式中运行。intetd模式在inetd.conf中指定运行apache的用户。一般为web服务设定一个特定的用户和组。并在这里更改用户的用户和组设置。

---------------------------------------------------------------------------------------------------------

2、主服务器段

#管理员邮件
serveradmin root@localhost   //指定管理员的邮件地址。当出错时,会发送邮件给这个邮件地址。

servername  localhost  //缺省不需要指定。服务器将自动通过DNS解析获得自已的名字。但有时候DNS服务器出错,没有正式的DNS名字,也可指定IP地址。此处设置即为指定服务器对外的正式名字。特别是在一个服务器有多个别名的情况下,总是返回这个正式名给外部。




#网站存放目录
documentroot  "/var/web/www/html"  //指定存放网页的根目录位置。可自行指定。如果要启动虚拟机,此处就要注释掉,主服务器和虚拟机不能共存。





#目录和文件的访问控制
apache对网页文件所在目录的访问控制有有两种方法:一种是设置httpd.conf对每个主页目录及文件进行访问控制。但这种方法每次更改后都需重启HTTPD。

二是在每个网页所在目录下设置访问控制文件。通常访问文件名字为htaccess,所以一般用httpd.conf来配置服务器系统的整体安全控制策略。而使用每个目录下的htaccess文件设置具体目录的访问控制更为灵活。


目录的访问控制

<directory  "/var/web/www/html">  //要设定权限的目录名,此例是设定目录/var/web/www/html的访问权限。
option  Indexes FollowSymLinks    //用来设置区块的功能,这里默认是允许索引目录和符号连接。
allow override none               //可以设定目录属性是否可以覆盖系统对权限的设定或设定认证方式才能访问。一是上级目录的权限会自动继承下来,此处设置可另设置与上级目录不一样的权限。
                                  //二是不使用目录中htaccess文件中规定的权限,在此处另设权限。

order allow,deny                 //用于定义哪些主机(基于IP,网络地址等)可以访问此目录,或不能访问此目录。这里设置当allow 和deny相冲突时,这里的意思是除了允许的,都拒绝。

Allow from all                   //此处设置哪些主机可以访问或不能访问,一般把IP地址加在后面,这里是允许所有。
 
</directory>   注意,目录的权限是可以继承的。



option 的参数详解:

All:          用户可在此目录中做任何事情。所有目录特性都有效。最好不要设定此项。
None:         不允许访问此目录。所有目录特性都无效。
FollowSymlinks:  可以使用符号连接到不在此目录中的文件或目录参数。只有符号连接的目的与符号连接本身为同一用户所拥有时才允许访问。此项在location中无效。
execcgi:       允许在此目录中执行CGI程序。
Indexes:       允许索引目录,一般不要启用。在没有index.htm等索引文件时,能向浏览器发送这个目录下的列表。
Includes:       提供ssi功能。
includes       noexec: 提供ssi功能,但不允许执行CGI程序中的#exec   #include命令。
multiviews:     使用权用内容商议功能。服务器和浏览器相互沟通后,决定返回哪个网页给客户,即决定网页传递性质。如多语言版网页时,可以定义网页浏览器优先返给用户英文版网页内容。此功能需单独加上。
symlinks if owner mactch:当符号链接指向的文件或目录拥有者和当前用户帐户相符,则服务器会通过符号链接访问不在该 目录下的文件或目录。


allow override 参数详解:

all:缺省值。使访问控制文件可以覆盖系统配置。即以.htaccess文件的权限为准。
none:服务器忽略访问控制文件的设置。即htaccess和上级目录权限无法影响到此目录的权限,以此目录自已的权限为准。
fileinfo:允许访问控制文件中使用 add type等参数设置。即htaccess文件中可以用addtype参数。
options:允许访问控制文件中用option参数定义目录的选项
authconfig:允许控制文件使用权用authname   authtype等针对每个用户的认证机制。使用权目录主能用口令和用户名来保护目录。允许对访问目录的客户机的IP地址和名字进行限制。




 例:目录采用认证方式访问:

 <Directory "/var/web">

Options none
AllowOverride AuthConfig                //设定目录采用用户认证机制访问。
AuthName "Reqstricted site"             //认证的名字,只是起个名字,没有物别意义
AuthuserFile "/etc/httpd/conf/htpasswd" //认证时用户名和密码存放的文件夹。 用htpasswd命令来创建htpasswd文件并添加、删除用户和密码。第一次使用时:htpasswd -c /etc/httpd/conf/htpasswd khp 只能第一次使用时用-c选项,如已有此文件就不能用-c,否则会把原来的文件删除了。    
AuthGroupFile "/etc/httpd/conf/group"  //定义组认证文件,在目录下创建group文件,并且把下面的组名加进去,在组名后面加入用户名即可。例:cat >group   myuser:khp,tom  //即myuser组中,有两个用户允许访问
Require user marion                     //marion在这里是用户名
#Require valid-user                     //允许htpasswd中的所有用户访问。
Require  myuser                         //允许myuser组访问。
 

    
控制文件的设定
access filename  .htaccess    //定议第每个目录下的访问控制文件的文件名。默认是 htaccess。可以更改这个文件里的内容来改变不同目录的访问控制。




文件的访问控制:

 以上是目录的访问控制,此处是单个文件的访问控制。
<file ~  " ^\.ht">       

order allow,deny
deny from all

<files>      
//不允许访问任何.ht的文件。


针对文件来设置访问控制。不管文件位于哪个目录下,只要名字匹配就要受到相应控制。


#索引文件优先顺序
DirectoryIndex   index.html   indx.htm  indx.php   index.cgi    //定义每个目录中的默认的网页文件名称。排在前面的优先。当网页目录中同时拥有几个索引网页文件时,排在前面的作为索引文件。当网页目录部没有上述中的任何一个文件时,将返回主目录的目录列表给客户。





#网页关联程序:

TypesConfig   /etc/mine.types  //设置各种文件类型关联。让网页浏览器知道该使用哪种软件来处理这些文件。把网页中包含的各种文件类型通知网页浏览器。
DefaultType  text/plain        //当无法识别文件类型时,则当成文本来处理。即当web服务器不能识别一个文件的类型时,就用此处定义的类型打开,此例子中定义的类型为文本类型。

<ifmodule mod_mine_magic.c>
MIMEMagicFile /usr/share/magic.mime
MIMEMagicFile conf/magic
</ifmodule>

//除了根据后缀名判断文件类型以外,还可以根据文件的内容判断文件的类型。上面是一条件语句,如果载入了这个模块,就必须指定相应的标志文件magic的位置。此模块并非默认加载。需用此功能,可以前面的全局设定中找到loadmodule模块。去掉前面的#号。重新启动服务器即会加载。





#日志记录及报错处理:

HostnameLookups off  //连接时服务器仅能记录得到客户机的IP地址。如果想同时得到记录客户的主机名,则把此项改为参数"on"。但这样逆向查询dns,会增加系统开销,反应慢。建议设为"OFF"。


Errolog  logs/error_log   //记录浏览器加载网页发生错误、以及关闭启动httpd信息。

logLevel  warn   //设置要存入erro.log文件中的消息等级。

log formet "%h
log format %.......  //设置每条记录的格式。有combined  common   referer   和agent 4种格式。不同的日志以不同的格式记录。

customlog  logs/access_log   combined  //访问记录的位置,使用common格式。

customlog   logs/referes_log  referer //referer格式记录通过本网络连接出去的网址。

server signature   on   //出错时,在返回的错误网页中加上server 的版本和主机名。





#目录别名设定

alias  /icons/   "var/www/icons/"    //为某一目录建成立别名。此处为  /var/www/icon/   目录建立了较短的别名/icons/

script alias  /cgi-bin/    "/var/www/cgi-bin/"   //为script程序的目录设置别名。此目录中的文件会被server视为可执行。scriptAlias是为URL路径的映射。script alias 是用于映射CGI程序的路径。这个路径下的文件都被定义为CGI程序。通过执行它们来得到结果,而不是服务器直接返回。

redirect oldurl   newurl   //当一个网页文档改变位置后,又希望老的链接可以访问,就用这条指定。

--------------------------------------------------------------------------------------------------

3、虚拟主机段(主服务器段和虚拟主机段不能同时生效)

基于IP,端口,域名三种方式设置虚拟主机。

先取消主服务器段的目录指定


可以在httpd.conf只加入以下文件,也可以在/etc/httpd/conf/文件夹下建一个.conf文件,把下面文件写进去。

#1
<VirtlHost 192.168.1.10:80>   
ServerName www.loready.cn
DocumentRoot /www/loready.cn

#2
<VirtlHost 192.168.1.11:80>    //一台主机上有多个IP地址。
ServerName www.loready.com
DocumentRoot /www/loready.com

#3
<VirtlHost 192.168.1.10:8080>    //ip地址相同,不同端口,记得要在listen中添加侦听端口。
ServerName www.loready.net
DocumentRoot /www/loready.net


#4
<VirtlHost 192.168.1.10:80>     //端口,地址都相同,只是域名不同。此时要域名要能解析才行。
ServerName www.loready.org
DocumentRoot /www/loready.org


#1和#2是基于Ip地址的虚拟主机
#1和#3是基于端口的虚拟主机
#1和#4是基于域名的虚拟主机

#<VirtlHost *:80>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>



httpd -t 检查配置文件语法
-------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
三、PHP

(一)运行机制

1、本身的执行过程

(1)php的早期运行机制:解析性语言,先进行词法分析,再进行语法分析,生成执行路径,然后执行。即直接编译后马上执行。每次执行都得进行以上步骤。

(2)zend engine的出现:把Php的处理分成了两段式,
       首先是分析PHP代码并将其转换为zend opcode的二进制格式(类式于java的字节码),并将其储存于内存中;
       第二阶段是使用zend engine去执行这些转换后的opcode。即:
       php 源代码 --》编译成二进制格式--》执行二进制格式

       这种方式是第一次执行时会慢,但以后执行时都会直接执行二进制格式,不需要先编译,就会很快。

(3)xcache

以前是每个用户执行Php源代码时,都会首先编译成二进制格式,存于自已的进程内存中,这样其他用户无法访问此已经编好的二进制格式。所以他用户如果访问同样的php程序时,还需要重新编译成二进制,也存于自已的进程内存中。
XCACHE机制是对php的优化,即当某用户访问php程序时,Php源代码编译成二进制格式放于统一的缓存中,此缓存对所有用户共享,这样可以使不同的用户访问此php程序时,都可以很快使用此已编译好的二进制代码。


(二)apache与php的联连机制

CGI

模块:最简单的模式
在AddType application/x-gzip .gz .tgz这一行下面添加
AddType application/x-httpd-php .php  (注意:php .php这个点前面有一个空格)
AddType application/x-httpd-php-source  .phps  新加此行

在这条后面增加.php

DirectoryIndex  index.php  index.html   找到次行添加index.php

fastCGI:配置麻烦,要编译PHP的FPM模块。

(三)Php安装


1、源码安装

./configure 参数:

    --prefix=/usr/local/php5
    --with-config-file-path=/etc  
    --with-mysql=/usr/local/mysql  
    --with-mysqli=/usr/local/mysql/bin/mysql_config
    --with-mysql-sock=/tmp/mysql.sock  
           
    --with-config-file-scan-dir=/etc/php.d     //设定配置文件文件夹,即在此文件夹下的所有.ini文件都会当作配置文件加载。
    --with-apxs2=/usr/local/apache2/bin/apxs  //将php编译成apache简单模块
    //--enable-fpm                            //这项是把php编成fast模块,与上面这条不能同时使用。
    --enable-mbstring
    --with-freetype-dir     //特定字体加载,需要安装freetype包
    --with-mcrypt        //加密功能,如要此项,需要先安装libmcrypt软件
    --with-openssl       //打开ssl功能

    --with-jpeg-dir   //需安装libjpeg-devel包
    --with-png-dir  //需先安装libpng-devel包
    --with-gd
    --with-iconv
    -
    --with-zlib         //支持的压缩文件
    --with-bz2
    --enable-zip

    --with-libxm-dir       //要先安装libxml2和libxml2-devel包
    --enable-xml        //xml


./configure --prefix=/usr/local/php5 --with-config-file-path=//usr/local/php5/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql-sock=/tmp/mysql.sock --with-apxs2=/usr/local/apache2/bin/apxs --with-freetype-dir --with-openssl --with-jpeg-dir --with-png-dir --with-gd  --with-zlib  --enable-zip --enable-xml

2、配置文件
(1)配置文件复制
  cp /usr/local/src/php-5.5.14/php.ini-production //usr/local/php5/etc/php.ini  //从源程序夹下把配置文件复制到etc下。
   rm -rf /etc/php.ini
   ln -s /usr/local/php5/etc/php.ini  /etc/php.ini         //创建配置文件软链接到etc目录下。

(2)配置文件修改

3、配置php与apache相关联
vim /etc/httpd/httpd.conf
在AddType application/x-gzip .gz .tgz这一行下面添加
AddType application/x-httpd-php .php  (注意:php .php这个点前面有一个空格)
AddType application/x-httpd-php-source  .phps  新加此行

至此php安装完成。

4、安装xcache到php中
xcache是php的扩展模块,可以独立安装的模块。

(1)解压缩xcache

(2)cd xcache-2.0.0    
/usr/local/php/bin/phpize    //在xcahe源码文件夹下执行php安装目录下的bin文件夹中的phpize程序,这个程序专门用来扩展php的扩展模块,所有扩展模块都需要用此命令执行一次然后再编译安装。

(3)./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make&&make install

(4)把xcache源码中的xcache.ini文件加入到php.ini文件中。如果安装php
如果在php安装时加有此项:--with-config-file-scan-dir=/etc/php.d ,那么在etc目录下建立一个php.d文件夹,把xcache.ini复制到php.d文件夹下就行。


(5)配置xcache.ini


5、工作文件详解:

/etc/httpd/conf.d/php.conf            //配置文件
/usr/lib/httpd/modules/libphp5.so     //模块位置
/var/lib/php/session

/etc/php.ini


(四)与数据库的连接方式

1、安装php53-mysql    //专门用于php与Mysql的软件。53是指版本。

2、写一个php脚本,以连接mysql

3、用PHPmyadmin管理mysql

PhpMyAdmin 是一个php  web页面,可以直接下载下来,放到可执行php环境中,从浏览器中打开这个页面即可以管理mysql数据库。
php53mCrypt  :安装这个软件增强PhpMyAdmin 的安全性。




(五)有名的Php程序及安装方法:


论坛:

discuz  免费的。  www.discuz.net上下载。
phpwind
phpbb

把下载下来的文件解压后,把updata下的所有文件复制到Php运行目录下即可。