LAMP基础
前言:上一篇博文,说到了URL、http的协议、事务以及私有https的实现。此次
一、 概念:
LAMP:
a:apache
m:mariadb,mysql
p:php,perl,python
二、apache & php
众所周知:httpd通常而言有两种资源类型:分为静态资源和动态资源,前者指的是客户端从服务器端获取资源的表现形式与原文件相同,后者指的是需要服务器执行之后,其结果放回客户端,换句话说客户端从服务器端获取资源的表现形式和原文件不尽相同。
静态服务器的响应模式便是最为普通、最为古老的响应方式,即客户端发起tcp建立虚链路、httpd接受请求并处理请求、获取资源、将资源封装成http报文发还给客户端、断开虚链路。从头至尾,httpd除了获取资源外没有做出其他额外多余的工作,也就是上文所说的资源表现形式不变,相反,动态资源则复杂得多。
client --> tcp --> httpd --> client
动态服务器的响应模式较静态服务器而言多了数个步骤,当httpd接受请求之后,发觉这是动态资源后,并不会直接处理请求而是将其交给应用应用程序的执行环境并处理请求,再由应用应用程序执行环境从服务器本地获取资源并执行,之后将其结果返回给服务器,服务器再将其封装为响应报文,发还给客户端,最后再断开虚链路。过程比静态服务器多了数个步骤,这也就是为什么动态资源运行之所以缓慢的原因。
client --> tcp --> httpd --> php --->httpd --> client
没错,聪明如你。从上图之中能够清楚得发觉,httpd与客户端使用http协议进行交互,httpd获取资源只需要发起系统调用,而httpd与后端php的交互确实未明。CGI协议便是httpd与后端进行交互的协议,CGI协议可视为阉割版的http协议,若将httpd视为网关,则php为服务器(具体这里便不进行讨论)。服务器端识别资源之后,通过CGI协议送给后端应用程序执行环境,后端接收之后从服务器端本地加载程序并运行。整个过程httpd属于掮客地位,一手托两家,最根本原因便是客户端本省并不能直接理解CGI协议,倘若能够直接理解CGI协议,就无需httpd,能够直接与后端通信。
httpd本身能够与后端进行交互的模块就叫CGI(httpd -M | grep cgi)
当然,只要后端能够通过CGI协议与httpd通信,后端程序并不需要理解URL,哪怕是bash解释器,只要是能够理解CGI,httpd也能狗通过调动bash解释器作为子进程来处理动态资源。不过,在服务器高并发情况下,这种额外运行子进程的方式会给服务器本身带来特别大的开销(这种方式由服务器本身来维护动态请求)。
此外,还有一种特殊的cgi,即fastcgi,它能够与前端httpd进行分离,各属于不同的服务器,之中再通过套接字进行通信,如此能够很有效的降低服务器开销。
三、MySQL
接下来便是MySQL。
程序由指令+数据组成,通常而言个人计算机所存储的数据皆在文本文件中,运行程序只需从文本文件读取数据随后运行便可,但这对服务器显得颇有难度。设想一下,某台服务器上存储着10G的数据表,现今运行程序需要表中的某些数据,将得10G的表全部加载至内存之中,按表逐字查询直到找到所需数据,取出需求的数据后再将其关闭,不一会又需要数据,又需重新加载10G的表,再次消耗10G的内存。
对个人终端而言一次加载10G的文件不过是停滞数秒乃至数十秒的时间,但对于线上服务器这一代毋容置疑是致命的,每次加载一次数据就得消耗10G的内存那还了得!
显然对于处理较大数据时,并不能按传统的文件查找形式,只因这种方式既消耗资源又不方便管理。
数据库管理系统便是既方便管理查找速度又快的方式。
不过,数据库管理系统多种多样,这里只谈论关系型数据管理系统。
简单而言,关系型数据库管理系统,能够将其有限的一个字段或几个字段提取出来,另存为一个新的数据集,且新存的数据集中每个用户都有一个指针,指针指向原始数据集中所存储文件的位置(数据块)。每次查找都只查询另存的新数据集,如此便轻量得多。
当然,若是抽取一次的数据不够小,那便继续抽取,直至足够小为止。
那么,真正的lamp架构应该为下图:
当然,应用程序与MySQL之间依旧通过协议进行交互,客户端能够直接通过应用程序直接连接Mysql进行互动。然而,在lamp架构中与MySQL进行交互的是,或php,或perl,或python,期间包涵无数代码,代码并不能直接理解协议,没错,机智的你已经发觉那就是通用库(库中的某段代码能够将请求封装为MySQL报文),只要是能够让代码调用库也就能够与MySQL进行互动了,现在,只缺一种能够催动通用库与MySQL进行通信的驱动。php程序员为php专门写了能够与MySQL通信的驱动——php-mysql。
三、小结
综上所述,一次完整的动态请求(lamp):客户端请求动态资源;httpd接受请求;将请求交由PHP处理;PHP从本地加载程序并运行;假设程序中有涉及用户信息的条件,则PHP发往MySQL;MySQL查询语句,将结果发给PHP,PHP可能与MySQL反复进行交互直至PHP不再需求数据为止;PHP将程序运行结果发还给httpd;httpd响应用户请求。
请求流程:client -->(http)-->httpd-->(cgi)-->application server(program file)-->(mysql)-->mariadb
一次动态完整请求如此复杂,这也就是为什么动态网站响应远远不及静态网站的理由。
直接安装:yum -y install apache php php-mysql mariadb-server ,之后直接启动即可。
安装完成之后使用 rpm -ql php 查看php的安装情况,会发现安装了两种方式,一为普通的配置文件,/etc/httpd/conf.d/php.conf;二为模块目录下/etc/httpd/conf.module.d/10-php.conf,/user/lib64/httpd/modules/libphp5.so。其实httpd有三种结合方式
httpd+php的三种模式:
modules:
httpd prefork:libphp5.so
httpd event or worker:libphp-zts.so
cgi
fastcgi
vim /www/htdocs/index.php 简单输出php页面
<?php
phpinfo();
?>
测试php是否连接至mysql:
<?php
$link=mysql_connect('127.0.0.1','mysql',');
if($link)
echo "OK";
else
echo "Failure";
mysql_close();
?>