下面介绍的是PHP、MeriaDB(MySQL)、编译安装AMP(httpd2.4、Meriadb、PHP)
一、PHP
1、web资源
web资源分为动态、静态两种资源。静态资源,即原始形式与响应一致。
CGI ------------------通用网关接口
CGI协议是简化的http协议,可以让一个客户端,从客户端代理向网络服务器上的程序传输数据。CGI描述了客户端和服务器程序之间数据传输的标准。
web数据请求流程:-------------httpd充当了服务器程序的反向代理
client(http) --> httpd --> cgi --> application process --> mysql --> MySQL
2、PHP基础 --------------通用服务器端脚本编程语言
(1)、PHP
通用服务器端脚本编程语言,专为web开发设计,将代码嵌入html文档中。PHP提供了命令行接口,可以当做一个shell来使用。
(2)、Zend Engine ---------PHP语言的解释器,为PHP提供内存和资源管理。
Zend Engine中,【PHP代码的处理过程】为:
PHP代码 -----> Zend opcode(二进制格式,存储于内存)--------->opcode(用Zend Engine执行)
1)、Scanning ---------将PHP代码转换为【语言片段】
2)、Parsing -------------将语言片段转换成【表达式】
3)、Compilation -------------将表达式编译成Opocdes
4)、Execution ---------------执行Opcodes(每次一条)
opcode -----------PHP脚本编译中间语言
(3)、PHP加速器 --------------PHP opcode缓存加速器(6种)
APC --------------不适用于PHP5.4
eAccelerator ---------------包含了PHP loader
Xcache ---------------快速、稳定
Zend Optimizer -------------适用PHP5.2及以前
Zend Guard Loader ------------适用PHP5.3
NuSphere PhpExpress
3、PHP源代码的子目录
build -------------------编译相关的文件
ext ----------------扩展目录,PHP函数的定义和实现
main -----------------PHP核心
Zend -------------实现Zend引擎(实现语言运行环境)
pear -----------PHP扩展与应用仓库
sapi -----------服务器抽象层的代码
TSRM --------------线程安全管理、*G宏
tests ------------PHP测试脚本集合
win32 -------------Windows实现平台
4、httpd与php的结合方式(4种):
CGI --------------httpd主进程管理php进程;
module ---------------将php编译为httpd的扩展模块;
MPM -----------prefork、event
FastCGI ---------fpm
二、MeriaDB(MySQL) -----------LAMP中的M,即MySQL(MariaDB)。
1、数据库管理基础
DBMS -------------数据库管理系统
RDBMS ----------数据表,行为实例,列为字段或域
ANSI ----------数据库系列标准(SQL-86、SQL-89、SQL-99、SQL-03)
NoSQL -------Redis、Memcached、MangoDB、Hbase(4类)
RDBMS设计范式:(数据库的六种范式) -----------------越高的范式数据库冗余越小
1)、第一范式(1NF)-----------对域添加规范(无重复的域)
在第一范式中,数据库表的每一列都是不可分割的数据项,不能是集合、数组、记录等。即实体中的某个属性有多个值时,必须拆分为不同的属性。
2)、第二范式(2NF)-------------每个实例或记录必须可以被唯一地区分
在第二范式中,选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。第二范式,要求实体的属性完全依赖于主关键字(主键)。
3)、第三范式(3NF)------------属性不依赖于其它非主属性
在第三范式中,要求一个关系中不能包含已在其它关系已包含的非主关键字信息。
4)、第四范式(4NF)
5)、第五范式(5NF)----------称完美范式
6)、巴德斯科范式(BCNF)、。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF
关系型数据库管理系统:GreSQL、SyBase、DBII、InfoMIX、Oracle、MySQL、MariaDB
CentOS 6:mysql-server-5.1
CentOS 7:mariadb-server-5.5
2、SQL基础
(1)、MeriaDB的数据模型 --------------二维关系
SQL --------------Structured Query Language(结构化查询语言)
SQL接口处理的SQL语句:DDL(数据定义语言)、DML(数据操纵语言)、DCL(数据控制语言)。
DDL -------------CREATE、ALTER、DROP
DML -------------INSERT、DELETE、UPDATE、SELECT
DCL -------------GRANT、REVOKE
(2)、ACID标准 -----------------MySQL存储引擎的属性(事务)
A -------------原子性
C -------------一致性
I -------------隔离性
D -------------持久性
(3)、SQL约束(4种):
主键约束 ------------主键数据不能相同,不能为空
外键约束 ---------------是否能引用,取决于另一张表的主键数据
唯一键约束 ------------唯一标识记录,主键不能相同,但可以为空
检查性约束 ------------------取决于表达式
(4)SQL关系运算(3种)
选择 ------------挑选行
投影 ------------挑选列
连接 --------------多表关联操作
(5)、SQL数据抽象(3种)
物理层 ------------决定数据的存储格式
逻辑层 -----------数据库存储的数据、数据之间的关系
视图层 ----------数据库中部分数据
3、mysql命令
MySQL的配置文件生效顺序:
/etc/mysql/my.cnf --> /etc/my.cnf --> ~/.my.cnf
(1)、mysql命令 -----------------------交互式、命令行、客户端程序
格式:mysql [OPTIONS] [database]
常用选项:
-D ------------使用哪一种数据库吗,可以不用空格进行分隔,默认为NULL
-e 'COMMAND' -------------执行命令并退出,用引号引出命令,两种引号都可以。
-h -----------------指定连接的MySQL数据库IP地址,也可以不用空格进行分隔,默认为localhost
-p ---------------指定远程连接到服务器时所需的密码,默认为空,也可以不用空格分隔
-P -------------以指定端口号来访问服务器,默认为3306,可不用空格
-u -------------指定连接至远程MySQL服务器的用户名,默认为root
(2)、mysql账户
MySQL用户账户由两部分组成:'USERNAME'@'HOST'
HOST可以使用两个通配符: %(任意长度任意字符), _(任意单个字符)
例:'root'@'172.16.%.%'
字符集:计算机显示的字符形状和硬盘上的映射
mysql_secure_installation命令 ---------------------完成MySQL的账户安全初始化
(3)、mysql的交互式命令:客户端命令、服务器端命令
客户端命令 --------本地命令:clear、delimiter、go、ego、quit、exit、source、status、use(可不加结束符)
clear -----------停止发送当前键入
delimiter -----------设置结束标记
go --------------将前面的语句,送往服务器执行
ego -------------将前面的语句,送往服务器执行,并将返回结果纵向显示
exit,quit -------退出mysql程序
status -------------获取服务器的状态信息
use -------------选择使用指定的数据库
服务器端命令 -------发送到服务器端运行再返回:DDL、DML、DCL
注意:在执行服务器命令时,每个语句必须以指定的结束符来结尾,默认是';'。
三个服务器命令如下:
DDL ---------数据定义语言。主要用于管理数据库的各组件,例如:数据库、表、索引、视图、用户、存储过程、存储函数、触发器、事件等。
常用的服务器命令:CREATE、ALTER、DROP、SHOW
DML ---------数据操纵语言。主要用于管理表中的数据,实现数据的增、删、改、查等操作。
常用的服务器命令:INSERT、DELETE、UPDATE、SELECT
DCL ---------数据控制语言。主要用于管理数据的访问授权。
常用的服务器命令:GRANT、REVOKE
mysql> help COMMAND_KEYWORD -------------获取帮助
MariaDB [(none)]> help COMMAND_KEYWORD
4、表管理--------------服务器端
(1)、数据库管理命令 mysql>
create ---------创建数据库(数据库名可能区分大小写,也可能不区分,取决于文件系统)
格式:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification]
mysql> show character set; ---------------查看当前MySQL服务器支持的【字符集】
mysql> show collation; -----------------查看当前MySQL服务器支持的各字符集对应的【排序规则】
alter ----------修改数据库属性
格式:ALTER {DATABASE | SCHEMA} [db_name] alter_specification ...
drop -----------删除数据库
格式:DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
(2)、表管理 mysql>
表包括行和列:
行,用于描述某个事物的某些属性,表中可以没有行,称为空表。
列,用来定义或描述某个具体的属性,表中至少要有一列属性,没有列的表没有意义。
数据类型:定义了数据类型,才能决定数据的【存储格式】,决定数据所能参与的【运算】,决定数据可以表示的【有效范围】。
数值型数据:(2类)
精确数值型:INT(4位)、TINYINT、SMALLINT、MEDIUMINT、BIGINT
近似数值型:FLOAT、DOUBLE
字符型数据类型:(4类)
定长字符型:CHAR、BINARY
变长字符型:VARCHAR、VARBINARY
对象存储:TEXT、BLOB
内置特殊类型:SET、ENUM
日期时间型:DATE、TIME、DATETIME、TIMESTAMP、YEAR
数据类型相关的修饰符:(2类)
与整数有关的:UNSIGNED,无符号整数,必须紧跟精确数值型之后。
AUTO_INCREMENT,数值递加1。
通用修饰符:NOT NULL、DEFAULT value
(3)、创建表
格式:CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options]
create table TAB_NAME-----------------创建表
create_definition:字段、键、索引
PRIMARY KEY ----------主键约束
UNIQUE KEY -----------唯一键约束
FOREIGN KEY -----------外键约束
例:
mysql> create table students (ID tinyint unsigned not null auto_increment primary key,Name char(30) not null,Age tinyint unsigned,Gender enum('M','F'));
(4)、删除表
格式:DROP TABLE [IF EXISTS] tbl_name [, tbl_name] ...
drop table TAB_NAME --------------删除一张表
(5)、修改表:修改各个字段的属性或定义。add进行添加,drop进行删除。
格式:ALTER TABLE tbl_name [alter_specification [, alter_specification] ...]
alter table TAB_NAME ----------修改表
例:
mysql> alter table students add Class varchar(50) not null; ----------添加字段
mysql> alter table students add unique key (Age); -----------------索引字段
mysql> alter table students drop key Age;
mysql> alter table students modify ID tinyint unsigned not null; ---------------修改子段属性
mysql> alter table students change Class Classes char(50) not null;
mysql> alter table stutents add unique key (age); ------------添加唯一键
(6)、查询表
desc ------------查询表
5、服务器端管理命令 -----------------DDL、DML、DCL
(1)DML
1)、insert -----------添加数据。
格式:INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (value1,value2,...),(...),...
注意,向表中插入的是【字符串】,需用【引号引用】,如果向表中插入的是数字,不能用引号引用。
例:
mysql> insert into students value (1,'little',17,23,'M');
mysql> insert into students (ID,Name,Classes) values (2,'Zhang Sanfeng',"Wudang"),(3,'Zhang Wuji',"Mingjiao");
mysql> select * from students; ------------查询
2)、select ----------单表查询
mysql> select * from TAB_NAME ------------查看表的所有字段
mysql> select ID,name from students ---------------投影:只显示我们需要的列。
mysql> select ID as stu_ID,Name as stu_Name -----------指定别名,表的内容不变
mysql> select * from TAB_NAME where clause ------------选择
操作符:LIKE -------------模糊匹配
RLIKE ------------使用正则表达式对字符串进行模式匹配
IS NULL/IS NOT NULL -------------判断指定字段是否为空
mysql> select * from students where Age < 40;
mysql> select * from students where Age is null;
mysql> select * from students where Name like '%ang%';
mysql> selcet * from students where rlike '^Z.*g$' -----------查找较慢
mysql> select * from TAB_NAME order by age desc ---------------排序
3)、update --------------修改表的数据
mysql> update students set age=age-10 where sex is not null;
mysql> select * from students where ID in (1,2,3,4,5); -------------据离散条件选择
mysql> update students set age=age+5;
mysql> update students set age=age-10 where gender is not null;
mysql> update students set age=age-20 order by age desc limit 5;
4)、delete -------------删除表数据。需进行限定,防止全表删除。
mysql> delete from students where Age > 50;
mysql> delete from students where Age <= 18;
mysql> delete from students where age <= 18;
mysql> delete from students order by id desc limit 5;
5)、mysql> use mysql ------------使用表
(2)、DCL
1)、GRANT ----------授权(查看、删除等)
mysql> grant select ON ysu.students to 'little'@'172.16.%.%' identified by 'little';
mysql> grant delete ON ysu.students to 'little'@'172.16.%.%' identified by 'little';
2)、REVOKE ----------回收权限
mysql> flush privileges;------------手动重读授权表,使授权生效
php 与 php-fpm不能共存
6、LAMP平台快速架构(httpd、php模块化通信) -------------项目
(1)、安装软件包
CentOS 7:yum install httpd php php-mysql mariadb-server
CentOS 6:yum install httpd php php-mysql mysql-server
(2)、创建虚拟主机
(3)、创建用于测试的账户 ----------------在MySQL或MariaDB中
mysql> create database wpdb;
mysql> grant all on wpdb.* to 'wpuser'@'172.16.%.%' identified by 'wppass';
(4)、测试php,测试php和mysql之间的通信,将以下源代码复制到以【index.php为文件名】的主页文件中。
测试php:
phpinfo();
?>
测试mysql连接性:
$conn = mysql_connect('172.16.100.71','testuser','testpass');
if($conn)
echo "OK";
else
echo "Failure";
?>
(5)、将某个应用复制到虚拟主机的文档根目录中,进行进一步测试。
三、编译安装AMP ----------httpd2.4、Meriadb
1、编译安装httpd2.4
例:编译安装httpd-2.4.27
(1)、编译安装apr
# tar xf apr-1.5.2.tar.gz
# cd apr-1.5.2
# ./configure --prefix=/usr/local/apr152
# make -j #
# make install
(2)、编译安装apr-util
# tar xf apr-util-1.5.4.tar.gz
# cd apr-util-1.5.2
# ./configure --prefix=/usr/local/apr-util154 --with-apr=/usr/local/apr152
# make -j #
# make install
(4)、编译安装httpd-2.4.27
# tar xf httpd-2.4.27.tar.gz
# cd httpd-2.4.27
# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-pcre --with-zlib --with-apr=/usr/local/apr152 --with-apr-util=/usr/local/apr-util154
# make -j #
# make install
(5)、导出
1)、导出二进制文件:--------防止二进制不兼容
创建/etc/profile.d/httpd24.sh
export PATH=/usr/local/apache24/bin:$PATH
2)、导出帮助文档(可选)
编辑/etc/man.config
MANPATH /usr/local/apache24/man
3) 导出头文件:
# ln -sv /usr/local/apache24/include/ /usr/include/httpd
(6)、如果想要使用service命令来启动或关闭服务,则需要为httpd提供sysV风格的脚本,脚本内容如下:/etc/init.d/httpd
注意:想要成功使用该脚本管理服务,要在/etc/httpd24/httpd.conf配置文件中添加以下指令:PIDFile "/var/run/httpd24.pid"
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# config: /etc/httpd24/httpd.conf
# config: /etc/sysconfig/httpd24
# pidfile: /var/run/httpd24.pid
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd24 ]; then
. /etc/sysconfig/httpd24
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache24/bin/apachectl
httpd=${HTTPD-/usr/local/apache24/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd24.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d 10 $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=$?
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f ${pidfile} ] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit 1
esac
exit $RETVAL
# chmod +x /etc/rc.d/init.d/httpd
# chkconfig --add httpd
# chkconfig httpd on
2、编译安装Meriadb ---------------通用二进制格式的MariaDB包
(1)、编译安装meriadb-5.5
# tar xf mariadb-5.5.57-linux-x86_64.tar.gz -C /usr/local
# groupadd -r -g 306 msyql
# useradd -r -u 306 -g mysql mysql
# cd /usr/local
# ln -sv /usr/local/mariadb-5.5.57-linux-x86_64 mysql
# cd mysql
# chown mysql. -R .
# mkdir /mydata/data -pv
# chown mysql. /mydata/data
# cp support-files/my-large.cnf /etc/my.cnf
添加配置条目:----------/etc/my.cnf
innodb_file_per_table = ON
skip_name_resolve = ON
datadir = /mydata/data
# cp support-files/mysql.server /etc/init.d/mysqld
(2)、导出二进制文件
# vim /etc/profile.d/maria5557.sh
export PATH=/usr/local/mysql/bin:$PATH
# source /etc/profile.d/maria5557.sh
(3)、导出库文件
mysql-x86_64.conf文件移除或改名为非.conf结尾的文件名;
# vim /etc/ld.so.conf.d/mariadb5557.conf
/usr/local/mysql/lib
# ldconfig -v
(4)、导出头文件
# ln -sv /usr/local/mysql/include /usr/include/mysql
(5)、初始化数据库
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
(6)、启动服务:
# service mysqld start
# chkconfig --add mysqld
# chkconfig mysqld on
3、编译安装php-5.6.31:
FastCGI实现方式为:php-fpm。centos6不支持FCGI模块,centos7支持FCGI模块。
fpm的配置文件:/etc/php-fpm.d/*.conf /etc/php-fpm.conf
需要依赖于:libxml2-devel, gd-devel, freetype-devel, libmcrypt-devel
(1)、安装php-5.6
# tar xf php-5.6.31.tar.gz
# cd php-5.6.31
# ./configure --prefix=/usr/local/php56 --enable-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-libxml-dir=/usr --with-zlib --with-apxs2=/usr/local/apache24/bin/apxs --with-config-file-path=/etc/php56.ini --with-config-file-scan-dir=/etc/php56.d --with-gd --with-jpeg-dir --with-png-dir --with-mcrypt
# make -j #
# make install
# cp php.ini-production /etc/php56.ini
# mkdir /etc/php56.d
# cp sapi/fpm/php-fpm.conf /etc/php56.d/
# vim /etc/php56.d/php-fpm.conf
user = nobody
group = nobody
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.status_path = /fpm-status
pm.max_requests = 500
pid = /usr/local/php56/var/run/php-fpm.pid
php_value[session.save_handler] = files ----------------pm方式的php进程存储session的路径
php_value[session.save_path] = /var/lib/php56/session
(2)、pm方式的php进程存储session的路径
# mkdir /var/lib/php56/session
# chown nobody.nobody /var/lib/php56/session
(3)、为php-fpm提供SysV风格脚本,并将其添加至服务列表
# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
# chmod +x /etc/rc.d/init.d/php-fpm
# chkconfig --add php-fpm
# chkconfig php-fpm on
(4)、修改/etc/rc.d/init.d/php-fpm
1)、添加:scan_conf_dir=/etc/php56.d
2)、修改:
php_fpm_CONF=${exec_prefix}/php-fpm.conf
改为:
php_fpm_CONF=${scan_conf_dir}/php-fpm.conf
(5)、启动服务
# service php-fpm start
4、httpd和fastCGI兼容通信 ------------------项目
FastCGI实现方式为:php-fpm。centos6不支持FCGI模块,centos7支持FCGI模块。
fpm的配置文件:/etc/php-fpm.d/*.conf /etc/php-fpm.conf
# yum install php-fpm php-pdo php-gd php-mbstring php-mysql
两个服务进程的配置文件:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf
服务进程的配置文件:(global、www两段)-------------/etc/php-fpm.d/www.conf
[global]:
pid = /run/php-fpm/php-fpm.pid
[www]: -------------/etc/php-fpm.d/www.conf配置文件中的pool的配置内容
user = apache
group = apache
listen = 127.0.0.1:9000
listen.backlog = 100
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.status_path = /fpm-status
pm.max_requests = 500
5、配置httpd和php-fpm结合 ---------------------项目
(1)、httpd的配置
DocumentRoot "/myweb/vhosts/www"
ServerName www.qhdlink.com
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php) fcgi://127.0.0.1:9000/myweb/vhosts/www/$1
Options None
AllowOverride None
Require all granted
(2)、设置php加速访问 --------------2种安装方式
编译安装:
下载xcache的源代码 http://xcache.lighttpd.net
编译xcache:
# tar xcache-3.2.0.tar.gz
# cd xcache-3.2.0
# phpize
# ./configure --enable-xcache --with-php-config=/usr/bin/php-config
# make -j #
# make install
EPEL安装:-----------直接使用rpm包安装,rpm包在EPEL源中
# yum install php-xcache