LAMP & PMP 介绍及部署
LAMP 相关概念介绍
1、LAM(M)P
L # linux
A # apache (httpd)
M # mysql, mariadb
M # memcached
P # php, perl, python
2、web 资源类型
- 静态资源:原始形式与响应内容一致
- 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端
3、web 相关语言
- 客户端技术:
html,javascript,css,jpg
- 服务器端技术:
php, jsp,python,asp
4、CGI(Common Gateway Interface)
-
通用网关接口:可以让一个客户端,从网页浏览器通过http服务器向执行在网络服务器上的程序传输数据;CGI描述了客户端和服务器程序之间传输的一种标准。
-
程序=指令+数据
数据模型: 层次模型 网状模型 关系模型:表(行+列) 关系模型 # IngreSQL, Oracle, Sybase, Infomix, DB2 # SQL Server, MySQL, PostgreSQL, MariaDB 指令:代码文件 数据:数据存储系统、文件
-
CGI 请求流程
Client--(httpd)-->httpd--(cgi)-->application server(program file)--(mysql)-->mysql
-
php:本编程语言、嵌入到html中的嵌入式web程序开发语言;基于zend编译成opcode(二进制格式的字节码,重复运行,可省略编译环境)。
5、LAMP 工作原理
6、AMP 使用概述
AMP 组合方式
第一种:client --> http protocol --> httpd + php module --> (php-mysql, mysql protocol) --> mysqld
第二种:client --> http protocol --> httpd --> fastcgi protocol --> fpm (php application server) --> (php-mysql, mysql protocol) --> mysqld
AMP 快速部署
CentOS 7:
Modules
:程序包httpd, php, php-mysql, mariadb-server
Modules
:启动的服务systemctl start mariadb.service httpd.service
FastCGI
:程序包httpd, php-fpm, php-mysql, mariadb-server
FastCGI
:启动的服务systemctl start mariadb.service php-fpm.service httpd.service
CentOS 6:
Modules
:程序包httpd, php, php-mysql, mysql-server
Modules
:启动的服务service mysqld start, service httpd start
PHP 相关概念介绍
1、PHP 简介
- 官网:
http://www.php.net/
- PHP是通用服务器端脚本编程语言,主要用于web开发实现动态web页面,也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用
- Rasmus Lerdorf 于1994年开始开发PHP,最初是一组被Rasmus Lerdorf 称作
“Personal Home Page Tool”
的Perl脚本, 可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf 使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms
的能力以及与数据库交互的特性,并将其重命名为“Personal Home Page/Forms Interpreter” 或 “PHP/FI”
。此时,PHP/FI 已经可以用于开发简单的动态 web 程序了,这即PHP1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet
讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布
1997年,两名以色列程序员 Zeev Suraski 和 Andi Gutmans 重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor
。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0
,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0
发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)
扩展机制以及一系列对PHP性能的改进
2、PHP Zend Engine
Zend Engine
是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司Zend Engine 1.0
于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine
为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用Zend Engine
的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式opcode(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode
3、PHP 的 Opcode
Opcode是一种PHP脚本编译后的中间语言,类似于Java 的 ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)
- 1、Scanning 词法分析,将PHP代码转换为语言片段(Tokens)
- 2、Parsing 语义分析,将Tokens转换成简单而有意义的表达式
- 3、Compilation 将表达式编译成Opcode
- 4、Execution 顺次执行Opcode,每次一条,从而实现PHP脚本的功能
总的过程就是:扫描–>分析–>编译–>执行
4、PHP 加速器
PHP 的加速器:基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的
常见的 PHP 加速器有:
- 1、APC (Alternative PHP Cache)
遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址http://pecl.php.net/package/APC
- 2、eAccelerator
源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址http://eaccelerator.net/
- 3、XCache
快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址:http://xcache.lighttpd.net/
,收录EPEL源 - 4、Zend Optimizer和Zend Guard Loader
Zend Optimizer
并非一个opcode加速器,它是由Zend Technologies
为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader
则是专为PHP5.3提供的类似于Zend Optimizer
功能的扩展。项目地址http://www.zend.com/en/products/guard/runtime-decoders
- 5、NuSphere PhpExpress
NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder
编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm
5、PHP 源码目录结构
PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:
- 1、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等
- 2、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测试等
- 3、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境
- 4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等
- 5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件
- 6、sapi —— 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口
- 7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,
TSRM(Thread Safe Resource Manager)
线程安全资源管理器 - 8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件
- 9、win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本
PHP 配置
PHP 是脚本语言解释器。
-
配置文件:
/etc/php.ini , /etc/php.d/*.ini
-
配置文件在php解释器启动时被读取,对配置文件的修改生效方法
Modules # 重启 httpd 服务 FastCGI # 重启 php-fpm 服务
-
/etc/php.ini
配置文件格式[foo]:Section Header directive = value 注释符:较新的版本中,已经完全使用;进行注释 # # 纯粹的注释信息 ; # 用于注释可启用的directive
-
php 常用设置
max_execution_time= 30 # 最长执行时间30s memory_limit 128M # 生产不够,可调大 display_errors off # 调试使用,不要打开,否则可能暴露重要信息 display_startup_errors off # 建议关闭 post_max_size 8M # 最大上传数据大小,生产可能临时要调大,比下面项要大 upload_max_filesize 2M # 最大上传文件,生产可能要调大 max_file_uploads = 20 # 同时上传最多文件数 date.timezone =Asia/Shanghai # 指定时区 short_open_tag=on # 开启短标签,如<? phpinfo();?>
-
php 其它
php.ini的核心配置选项文档 # http://php.net/manual/zh/ini.core.php php.ini配置选项列表 # http://php.net/manual/zh/ini.list.php # php语言格式 <?php ...php code... ?>
PHP 代码
1、格式一
<?php
echo "<h1>Hello world!</h1>"
?>
2、格式二
<h1>
<?php echo "Hello world!" ?>
</h1>
3、php测试代码
<?php
echo date("Y/m/d H:i:s");
phpinfo();
?>
4、使用mysql扩展连接数据库的测试代码
<?php
$conn = mysql_connect(‘mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
#echo mysql_error();
mysql_close();
?>
5、Php使用mysqli扩展连接数据库的测试代码
<?php
$mysqli=new mysqli("mysqlserver",“username",“password");
if(mysqli_connect_errno()){
echo "Failure";
$mysqli=null;
exit;
}
echo “OK";
$mysqli->close();
?>
5、使用pdo扩展连接数据库的测试代码1
<?php
$dsn='mysql:host=mysqlhost;dbname=test';
$username=‘root';
$passwd=‘magedu';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
?>
6、使用pdo扩展连接数据库的测试代码2
<?php
try {
$user=‘root';
$pass=‘magedu';
$dbh = new PDO('mysql:host=mysqlhost;dbname=mysql’, $user, $pass);
foreach($dbh->query('SELECT user,host from user') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
LAMP 部署与配置
1、LAMP 主要安装部分
- httpd:接收用户的web请求;静态资源则直接响应;动态资源为php脚本,对此类资源的请求将交由php来运行
- php:运行php程序
- MariaDB:数据管理系统
2、HTTP 与 PHP 结合的方式
-
CGI(现在很少用这种方式)
-
FastCGI
-
modules (将php编译成为httpd的模块,默认方式)
MPM: prefork: libphp5.so event, worker: libphp5-zts.so
3、CentOS 6/7 所需要安装的模块(实现LAMP)
-
CentOS 7:
Modules # httpd, php, php-mysql, mariadb-server FastCGI # httpd, php-fpm, php-mysql, mariadb-server
-
CentOS 6:
Modules # httpd, php, php-mysql, mysql-server FastCGI # 默认不支持
4、LAMP 安装
注意:要使用 prefork 模型。
CentOS 6(Modules)
Modules:程序包 httpd, php, php-mysql, mysql-server
```
# yum install httpd, php, mysql-server, php-mysql
# service httpd start
# service mysqld start
```
CentOS 7(Modules)
Modules:程序包 httpd, php, php-mysql, mariadb-server
```
# yum install httpd, php, php-mysql, mariadb-server
# systemctl start mariadb.service httpd.service
```
CentOS 7(FastCGI)
FastCGI:程序包 httpd, php-fpm, php-mysql, mariadb-server
```
# yum install httpd, php-fpm, php-mysql, mariadb-server
# systemctl start mariadb.service php-fpm.service httpd.service
```
-
CentOS 7 安装后,默认生成的 php 文件
# rpm -ql php /etc/httpd/conf.d/php.conf /etc/httpd/conf.modules.d/10-php.conf /usr/lib64/httpd/modules/libphp5.so /usr/share/httpd/icons/php.gif /var/lib/php/session
5、php 主文件说明(/etc/httpd/conf.d/php.conf
)
文件结尾是 .php 的文件,才会交由 php 去运行。所以以 .html 运行是不会调用的,显示页面不会和预想的一样。
php 也是高度模块化的,称作 php 扩展。(可以是官方扩展,也可以是第三方扩展。)
可结合 php 配置主文件进行理解。
# cat /etc/httpd/conf.d/php.conf
# FileMatch 后匹配正则表达式,匹配任意以 .php(\ 是转译符)结尾的文件,调用模块执行
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
AddType text/html .php
DirectoryIndex index.php
php_value session.save_handler "files"
php_value session.save_path "/var/lib/php/session"
PHP 示例:创建一个显示 PHP INFO 的网页
- (1)在HTTPD 的文件根目录下创建一个 .php 结尾的文件
[root@neo html]# pwd
/var/www/html
[root@neo html]# ls
phpinfo.php
[root@neo html]# cat phpinfo.php
<html>
<title>PHP Test Page</title>
<body>
<h1>PHP Info Page<h1>
<?php # 调用 php 命令(;分号用于调用命令结尾)
phpinfo(); # phpinfo 是php的一个内部命令,用于显示php信息
?> # 开头和结尾要成对出现 <? ?>
</body>
</html>
- (2)使用浏览器进行页面访问
http://172.16.141.252/phpinfo.php
,成功显示 PHP INFO
- (3)在PHP INFO界面上,如果能看到 mysql 模块信息,说明 php 和 mysql 接口正常
6、mysql 启动、状态及登入(说明 mysql 启动成功)
可使用systemctl start mariadb.service
来启动 mysql 服务程序。第一次启动会比较慢,启动成功后,会多一个 TCP:3306 的监听端口。如下:
[root@neo ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@neo ~]# mysql # 进入数据库
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 5.5.60-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> SHOW DATABASES; # 显示数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> quit # 退出数据库
Bye
7、常见LAMP应用
- PhpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库
- WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可把 WordPress当作一个内容管理系统(CMS)来使用
- PHPWind:2003年发布了PHPWind的前身版本ofstar,并发展成为包含BBS、CMS、博客、SNS等一系列程序的通用型建站软件, 于2008年加入阿里巴巴集团
- Crossday Discuz! Board(简称 Discuz!)是一套通用的社区论坛软件系统。自2001年6月面世以来,是全球成熟度最高、覆盖率最大的论坛软件系统之一。2010年8月23日,与腾讯达成收购协议
- ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。2006年6月,ECShop推出第一个版本1.0
PHP 使用 mysql 扩展连接数据库测试
1、语法格式:使用mysql扩展连接数据库的测试代码
<?php
$conn = mysql_connect(‘mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
#echo mysql_error();
#mysql_close();
?>
2、在 HTTPD 的文件根目录创建 mysqltest.php
[root@neo ~]# ll /var/www/html/
total 8
-rw-r--r--. 1 root root 162 Aug 8 05:10 mysqltest.php
-rw-r--r--. 1 root root 113 Aug 8 03:41 phpinfo.php
[root@neo ~]# cat /var/www/html/mysqltest.php
<?php
$conn = mysql_connect('127.0.0.1','root',''); # root 是登陆 mysql 的用户名
if ($conn)
echo "OK";
else
echo "NOT OK";
?>
3、进行验证
在 mariadb 启动的情况下,显示 连接成功(OK),未启动的情况下,显示 连接不成功(NOT OK)。
[root@neo ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@neo ~]# curl http://127.0.0.1/mysqltest.php
OK
[root@neo ~]# systemctl stop mariadb.service
[root@neo ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@neo ~]# curl http://127.0.0.1/mysqltest.php
NOT OK
[root@neo ~]# systemctl start mariadb.service
[root@neo ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@neo ~]# curl http://127.0.0.1/mysqltest.php
OK
4、注意事项
- 在登陆
mysql
数据库时不解析IP地址:可修改/etc/my.cnf
文件,添加skip_name_resolve=ON
,但是需要重启mysql才能生效 - 创建文件后,需要 apache 用户能访问,要确保 other 用户有读权限(这样的话,才能使用 HTTPD 进行访问)