httpd2.4的基本配置,lamp和php简介,php配置,mariadb(MySQL)(第22天)
回顾:httpd协议基础,httpd的基础配置
http事务:请求<-->响应
request报文:
<method> <URL> <version>
<HEADERS>
<entity>
response报文:
<version> <status> <reason phrase>
<HEADERS>
<entity>
请求方法:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, ...
响应状态码:
1xx: 额外信息
2xx: 成功类,200
3xx: 重定向类
4xx:客户端错误
5xx:服务器端错误
httpd-2.4的新特性:
(1) MPM支持运行DSO(动态共享对象)机制;以模块形式按需加载;
(2) 支持event MPM;event在httpd-2.2中是实验性质,在http-2.4中已成熟
(3) 支持异步读写;
(4) 支持每模块及每个目录分别使用各自的日志级别;
(5) 每请求配置;<If>
(6) 增强版的表达式分析器;
(7) 支持毫秒级的keepalive timeout;
(8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令;
(9) 支持用户自定义变量;
httpd-2.4的新模块:
(1) mod_proxy_fcgi
(2) mod_ratelimit
(3) mod_remoteip
修改了一些配置机制:
不再支持使用Order, Deny, Allow来做基于IP的访问控制;
安装httpd2.4
apr表示 apache portable runtime apache运行时环境
httpd2.4依赖于apr-1.4+, apr-util-1.4+, [apr-icon]
centos 6上提供的是 apr-1.3.9, apr-util-1.3.9 ,所以要在centos 6上安装httpd 2.4要自己编译apr-1.4+和apr-util-1.4+软件包。
在centos 6上编译安装apr-1.4+和apr-util-1.4+的步骤如下:
1) 安装开发环境
yum -y groupinstall "Development Tools" "Server Platform Development"
2) 安装pcre-devel
yum -y install pcre-devel
3)编译安装apr
./configure --prefix=/usr/local/apr
make && make install
4)编译安装apt-util,要指明apr的安装目录
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
在centos 6上安装httpd2.4的步骤:
1) 创建系统组
groupadd -r apache
2)创建系统用户apache,并加入到组apache
groupadd -r -g apache apache
3)编译安装 httpd2.4
./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
make && make install
启动httpd服务:
apachectl start
CentOS 7上的httpd2.4
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
模块配置文件:/etc/httpd/conf.modules.d/*.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
mpm模型:以DSO机制提供,配置文件/etc/httpd/conf.modules.d/00-mpm.conf中可以开启prefork,worker,event任一模块
配置内容为如下:选择配置其中一个即可,这些模块文件位于/usr/lib64/httpd/modules/
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so
服务控制:systemctl {start|stop|restart|status|reload} httpd.service
httpd2.4的配置:
(1) 切换使用MPM
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME可取值有prefork, event, worker
(2) 修改'Main' server的DocumentRoot
(3) 基于IP的访问控制法则
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all denied
控制特定IP访问:
Require ip IPADDR:授权指定来源地址的主机访问
Require not ip IPADDR:拒绝指定来源地址的主机访问
IPADDR的格式如下:
IP: 172.16.100.2
Network/mask: 172.16.0.0/255.255.0.0
Network/Length: 172.16.0.0/16
Net: 172.16
控制特定主机(HOSTNAME)访问
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME的格式如下:
FQDN: 特定主机
DOMAIN:指定域内的所有主机
结构形式如下:
<Directory "">
<RequireAll>
Require all granted
Require not ip 10.252.46.165
</RequireAll>
</Directory>
(4) 虚拟主机
基于IP、Port和FQDN都支持;
基于FQDN的不再需要NameVirtualHost指令;
(5) ssl
启用模块:LoadModule ssl_module modules/mod_ssl.so
在/etc/httpd/conf.modules.d/00-ssl.conf文件中加入如上的内容。
(6) CentOS 6 服务脚本
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible \
# server implementing the current HTTP standards.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd/httpd.pid
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: The Apache HTTP Server is an extensible server
# implementing the current HTTP standards.
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
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/apache/bin/apachectl
httpd=/usr/local/apache/bin/httpd
prog=httpd
pidfile=${PIDFILE-/var/run/httpd/httpd24.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure. So we just do it the way init scripts
# are expected to behave here.
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
# When stopping httpd, a delay (of default 10 second) is required
# before SIGKILLing the httpd parent; this gives enough time for the
# httpd parent to SIGKILL any errant children.
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d ${STOP_TIMEOUT} $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=6
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
# Force LSB behaviour from killproc
LSB=1 killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
if [ $RETVAL -eq 7 ]; then
failure $"httpd shutdown"
fi
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart|try-restart)
if status -p ${pidfile} $httpd >&/dev/null; then
stop
start
fi
;;
force-reload|reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
RETVAL=2
esac
exit $RETVAL
-----------------------------------分割线-------------------------------------
LAMP: Linux + Apache +Mysql +Php
a: apache
m: mariadb, mysql
p: php, perl, python
LAMMP: memcached
静态资源:静态内容;客户端从服务器获得的资源的表现形式与原文件相同;
动态资源:通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端;
当客户端访问动态资源的时候,比如访问的是www.xxxx.com/search.php?id=8,这时候httpd并不能直接处理该请求,而是将该请求交予php模块处理,php模块处理完成之后,将结果返回给httpd,httpd把结果封装到响应报文中。httpd和php模块之间的交互和协议就称之为CGI,通用网关接口。
CGI: Common Gateway Interface
fastcgi:
httpd+php: httpd和php组合的方式 有3种形式:
modules 模块形式
cgi cgi形式
fastcgi(fpm) fastcgi形式
请求流程:Client --> (http协议) --> httpd --> (cgi协议) --> application server (program file) --> (mysql) --> mariadb
请求流程的文字解析:客户端浏览器通过httpd协议发送请求报文给服务器端的httpd程序,如果该请求是请求动态资源的,httpd程序通过CGI协议调用application server程序运行起来,处理该请求,如果该请求还涉及存取数据库的数据,application server程序则要链接数据库服务,存取数据库上的文件来完成客户端的请求。
CentOS 7上使用LAMP组合需要用到的软件包:
程序包:httpd, php, php-mysql, mariadb-server,mariadb
注意:php要求httpd使用prefork MPM,php-mysql包是php连接mysql的驱动
启动服务:
systemctl start httpd.service
systemctl start mariadb.server
CentOS 6上使用LAMP组合需要用到的软件包:
程序包:httpd, php, php-mysql, mysql-server,mysql
启动服务:
service httpd start
service mysqld start
测试LAMP环境
先安装上面的软件包:yum -y install httpd php php-mysql mariadb-server
php程序执行环境:
test.php
<?php
phpinfo();
?>
测试php程序与mysql通信
test2.php
<?php
$conn = mysql_connect('HOST:PORT','USERNAME','PASSWORD');
if ($conn)
echo "OK";
else
echo "Failure";
mysql_close();
?>
wordpress的安装和使用:
到 https://cn.wordpress.org/wordpress-4.8.1-zh_CN.zip 下载wordpress
unzip wordpress-4.8.1-zh_CN.zip 解压
cp -a wordpress /var/www/html 复制到/var/www/html/目录下
cd /var/www/html/wordpress
cp wp-config-sample.php wp-config.php
编辑wp-config.php文件:设置数据库相关信息
define('DB_NAME', 'wpdb'); 数据库名为wpdb
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser'); 数据库用户
/** MySQL数据库密码 */
define('DB_PASSWORD', 'wppasswd'); 数据库密码
/** MySQL主机 */
define('DB_HOST', '127.0.0.1'); 数据库服务主机的ip地址
/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8');
/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');
进入数据库:
GRANT ALL ON wpdb.* TO 'wpuser'@'localhost' IDENTIFIED BY 'wppasswd';
GRANT ALL ON wpdb.* TO 'wpuser'@'127.0.0.1' IDENTIFIED BY 'wppasswd';
CREATE DATABASE wpdb;
FLUSH PRIVILEGES;
使用浏览器访问:http:192.168.62.159/wordpress 设置wordpress的相关信息:
站点标题:个人web技术分享
用户名:wpadmin
密码:wpadmin
点击 安装wordpress 即可完成。
phpMyAdmin的安装和使用:
phpMyAdmin: mariadb的WebGUI
php解释器如何与MariaDB交互:
解释器无须与MariaDB交互,那些用到数据存储系统的程序才需要与数据存储系统交互;
存储系统的分类:
文件系统:文件
SQL:MariaDB, Oracle, MSSQL, ...
NoSQL:redis, mongodb, hbase, ...
NewSQL:
关于PHP
一、PHP简介
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程序了,这即是PHP 1.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性能的改进。
二、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的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。
三、PHP的Opcode
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):
1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)
2、Parsing —— 将Tokens转换成简单而有意义的表达式
3、Compilation —— 将表达式编译成Opocdes
4、Execution —— 顺次执行Opcodes,每次一条,从而实现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 Centos7的rpm包名为php-xcache
快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/
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
五、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相关的脚本。
------------------------------分割线---------------------------------------------------
回顾:
httpd+php组合的形式有3种:
modules 模块形式
httpd prefork: libphp5.so
httpd event or worker: libphp5-zts.so
cgi cgi形式
fpm fast-cgi形式
php: www.php.net
php: zend engine,
生成opcode
excute opcode
php:
php解释器
php的配置文件:/etc/php.ini, /etc/php.d/*.ini (rpm -qc php-common)
配置文件(php.ini)在PHP启动时被读取。对于服务器模块版本的PHP,仅在web服务器启动时读取一次。对于CGI和CLI 版本,每次调用都会读取。
php.ini文件的格式:
[Foo]: Secion Header
directive = value
; 分号表示注释符;
php.ini核心配置选项:http://php.net/manual/zh/ini.core.php
php.ini配置选项列表:http://php.net/manual/zh/ini.list.php
mariadb(mysql):
数据结构模型:层次模型、网状结构、关系模型
关系模型:二维关系:row, column
数据库管理系统:DBMS
关系数据库管理系统:Relational,RDBMS
补充材料:RDMBS设计范式基础概念
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
(1) 第一范式(1NF)
所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。
(2) 第二范式(2NF) 每个表的记录都有唯一主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。
(3) 第三范式(3NF)
第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。
RDBMS:
MySQL: MySQL, MariaDB, Percona-Server
PostgreSQL: 简称为pgsql --> EnterpriseDB
Oracle:
MSSQL:
SQL语句的处理过程如下图:
数据库的事务:多个操作被当作一个整体对待
ACID:
A: 原子性;
C:一致性;
I: 隔离性;
D:持久性;
SQL: Structure Query Language 结构化查询语言;
SQL解释器:
数据存储协议:应用层协议,C/S
S:server, 监听于套拼字,接收并处理客户端的应用请求;
C:Client,发送sql请求。客户端有CLI(命令行接口)和GUI(图形界面接口)。应用编程接口,比如ODBC:Open DataBase Connection。
数据库的基本概念:
约束:constraint,向数据表提供的数据要遵守的限制;(包括主键,唯一键,外键,检查性等)
主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL;一个表只能存在一个
唯一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL; 一个表可以存在多个
外键:一个表中的某字段可填入数据取决于另一个表的主键已有的数据;
检查性约束
索引:将表中的一个或多个字段中的数据复制一份另存,并且此些需要按特定次序排序存储;
关系运算:
选择:挑选出符合条件的行(部分);
投影:挑选出需要的字段;
连接:表示多表连接,join,left join,right join
数据库中的数据的抽象:
物理层:决定数据的存储格式,即RDBMS在磁盘上如何组织文件;
逻辑层:描述DB存储什么数据,以及数据间存在什么样的关系;
视图层:描述DB中的部分数据;表示只只关心的逻辑数据(可能是多表连接等等各种方式产生的数据)
关系模型的分类:
关系模型
实体-关系模型
基于对象的关系模型
半结构化的关系模型
安装MySQL的形式:
源代码:编译安装
二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
程序包管理管理的程序包:rpm包和deb包
MariaDB的特性:
插件式存储引擎:存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择;
存储引擎也称之为“表类型”;
(1) 更多的存储的存储引擎
mysql的MyISAM存储引擎 --> 对应MariaDB的Aria存储引擎,
mysql的InnoDB存储引擎 --> 对应MariaDB的XtraDB存储引擎
(2) 诸多扩展和新特性
(3) 提供了较多测试组件
(4) truly open source
安装和使用MariaDB
CentOS 7直接提供;
CentOS 6中安装通用二进制格式的MariaDB的方式如下:
下载链接:
wget -c "https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-5.5.58/bintar-linux-x86_64/mariadb-5.5.58-linux-x86_64.tar.gz"
(1) 准备数据目录,可以把数据放在btrfs文件系统上
以/mydata/data为例
mkdir -pv /mydata/data
chown -R mysql:myql /mydata/data
2) 配置mariadb
# groupadd -r -g 306 mysql 创建系统组mysql
# useradd -r -g 306 -u 306 mysql 创建系统用户mysql ,并加入mysql组
# tar xvf mariadb-5.5.58-linux-x86_64.tar.gz -C /usr/local 解压到/usr/local/目录
# ln -sv mariadb-5.5.58-linux-x86_64 /usr/local/mysql
# cd /usr/local/mysql
# chown -R root:mysql ./* 改变文件和目录的属主和属组
# scripts/mysql_install_db --datadir=/mydata/data --user=mysql
# cp supper-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
(3) 准备配置文件
配置格式:类ini格式,为各程序均通过单个配置文件提供配置信息;
[prog_name]
配置文件查找次序:
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf 其中--default-extra-file的选项为scripts/mysql_install_db --help可以查看
# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
/etc/mysql/my.cnf文件中[mysqld]段下添加如下三个选项: /etc/mysql/my.cnf文件每个选项为DBA
datadir = /mydata/data 数据库数据的存放目录
innodb_file_per_table = on 每张表都是用innodb存储引擎
skip_name_resolve = on 跳过名称解析
最后启动MariaDB:
service mysqld start 可能出现无法创建日志文件(/var/log/mysqld.log)的错误,解决方法,touch /var/log/mysqld.log && chown mysql:mysql /var/log/mysqld.log
MariaDB的程序组成:
Client:客户端
mysql:CLI交互式客户端程序;
mysqldump, mysqladmin...
Server:服务端
mysqld_safe
mysqld
mysqld_multi
服务器监听的两种socket地址:
ip socket: 监听在tcp的3306端口,支持远程通信;
unix sock: 监听在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),仅支持本地通信;server: localhost, 127.0.0.1
命令行交互式客户端程序mysql的使用:mysql
-uUSERNAME: 用户名;默认为root
-hHOST: 服务器主机; 默认为localhost
-pPASSWORD:用户的密码; 默认为空密码
注意:mysql用户账号由两部分组成:'USERNAME'@'HOST'; 其中HOST用于限制此用户可通过哪些主机远程连接mysql服务;支持使用通配符 %和_
%: 匹配任意长度的任意字符;比如172.16.0.0/16, 172.16.%.%
_: 匹配任意单个字符;
具体查看MySQL的mysql数据库里的user表:可以看到mysql的账号使用user字段和host字段组成:
SELECT user,host,password from mysql.user;
/usr/local/mysql/bin/mysql_secure_installation:安全初始化程序,用来给mysql root用户设置密码,禁止root远程登录,删除匿名mysql用户等
mysql命令:分为客户端命令和服务器端命令
客户端命令:本地执行
mysql> help
每个命令都完整形式和简写格式;
status, \s status就是完整形式,\s就是简写格式
服务端命令:通过mysql协议发往服务器执行并取回结果
每个命令都必须命令结束符号;默认为分号;
例如: select version();
关系型数据库的常见组件:
数据库:database, mysql的一个数据库在文件系统上一般就是一个目录
表:table
行:row
列:column
索引:index
视图:view
用户:user
权限:privilege
存储过程:procedure
存储函数:function
触发器:trigger
事件调度器:event scheduler
SQL语句:分为DDL+DML
DDL: Data Defination Language 数据定义语言
CREATE, DROP, ALTER
DML: Data Manipulation Language 数据操作语言
INSERT, DELETE, UPDATE, SELECT
GRANT, REVOKE
数据库的简单使用:
创建数据库:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name;
删除数据库:
DROP DATABASE|SCHEMA [IF EXISTS] db_name;
CHARACTER SET 'charecter set name'
COLLATE 'collate name'
查看支持所有字符集:SHOW CHARACTER SET;
查看支持所有排序规则:SHOW COLLATION;
例如:CREATE DATABASE IF NOT EXISTS myblog CHARACTER SET 'utf8';
获取命令使用帮助:
mysql> HELP KEYWORD; 例如 HELP CREATE TABLE;
查看所有数据库:
mysql> SHOW DATABASES;
表的简单使用:
创建表:
CREATE TABLE [IF NOT EXISTS] tb_name (col1 datatype 修饰符, col2 datatype 修饰符) ENGINE=''
查看所有的引擎:SHOW ENGINES;
查看表:SHOW TABLES [FROM db_name]
查看表结构:DESC [db_name.]tb_name
删除表:
DROP TABLE [IF EXISTS] tb_name;
数据库的数据类型介绍:
字符型有如下几种:
定长字符型:CHAR(#), BINARY(#)
变长字符型: VARCHAR(#), VARBINARY(#)
对象存储:TEXT(不区分大小写)和BLOB(binary large object 区分字符大小写)
内置类型:ENUM(枚举)和SET(集合)
数值型:int,tinyint 1byte,smallint 2bytes,mediumint 3bytes,int 4bytes,bigint 8bytes,decimal(十进制类型),float, double
修饰符:
NOT NULL:非空约束
DEFAULT value: 设定默认值
http事务:请求<-->响应
request报文:
<method> <URL> <version>
<HEADERS>
<entity>
response报文:
<version> <status> <reason phrase>
<HEADERS>
<entity>
请求方法:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, ...
响应状态码:
1xx: 额外信息
2xx: 成功类,200
3xx: 重定向类
4xx:客户端错误
5xx:服务器端错误
httpd-2.4的新特性:
(1) MPM支持运行DSO(动态共享对象)机制;以模块形式按需加载;
(2) 支持event MPM;event在httpd-2.2中是实验性质,在http-2.4中已成熟
(3) 支持异步读写;
(4) 支持每模块及每个目录分别使用各自的日志级别;
(5) 每请求配置;<If>
(6) 增强版的表达式分析器;
(7) 支持毫秒级的keepalive timeout;
(8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令;
(9) 支持用户自定义变量;
httpd-2.4的新模块:
(1) mod_proxy_fcgi
(2) mod_ratelimit
(3) mod_remoteip
修改了一些配置机制:
不再支持使用Order, Deny, Allow来做基于IP的访问控制;
安装httpd2.4
apr表示 apache portable runtime apache运行时环境
httpd2.4依赖于apr-1.4+, apr-util-1.4+, [apr-icon]
centos 6上提供的是 apr-1.3.9, apr-util-1.3.9 ,所以要在centos 6上安装httpd 2.4要自己编译apr-1.4+和apr-util-1.4+软件包。
在centos 6上编译安装apr-1.4+和apr-util-1.4+的步骤如下:
1) 安装开发环境
yum -y groupinstall "Development Tools" "Server Platform Development"
2) 安装pcre-devel
yum -y install pcre-devel
3)编译安装apr
./configure --prefix=/usr/local/apr
make && make install
4)编译安装apt-util,要指明apr的安装目录
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
在centos 6上安装httpd2.4的步骤:
1) 创建系统组
groupadd -r apache
2)创建系统用户apache,并加入到组apache
groupadd -r -g apache apache
3)编译安装 httpd2.4
./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
make && make install
启动httpd服务:
apachectl start
CentOS 7上的httpd2.4
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
模块配置文件:/etc/httpd/conf.modules.d/*.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
mpm模型:以DSO机制提供,配置文件/etc/httpd/conf.modules.d/00-mpm.conf中可以开启prefork,worker,event任一模块
配置内容为如下:选择配置其中一个即可,这些模块文件位于/usr/lib64/httpd/modules/
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so
服务控制:systemctl {start|stop|restart|status|reload} httpd.service
httpd2.4的配置:
(1) 切换使用MPM
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME可取值有prefork, event, worker
(2) 修改'Main' server的DocumentRoot
(3) 基于IP的访问控制法则
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all denied
控制特定IP访问:
Require ip IPADDR:授权指定来源地址的主机访问
Require not ip IPADDR:拒绝指定来源地址的主机访问
IPADDR的格式如下:
IP: 172.16.100.2
Network/mask: 172.16.0.0/255.255.0.0
Network/Length: 172.16.0.0/16
Net: 172.16
控制特定主机(HOSTNAME)访问
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME的格式如下:
FQDN: 特定主机
DOMAIN:指定域内的所有主机
结构形式如下:
<Directory "">
<RequireAll>
Require all granted
Require not ip 10.252.46.165
</RequireAll>
</Directory>
(4) 虚拟主机
基于IP、Port和FQDN都支持;
基于FQDN的不再需要NameVirtualHost指令;
(5) ssl
启用模块:LoadModule ssl_module modules/mod_ssl.so
在/etc/httpd/conf.modules.d/00-ssl.conf文件中加入如上的内容。
(6) CentOS 6 服务脚本
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible \
# server implementing the current HTTP standards.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd/httpd.pid
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: The Apache HTTP Server is an extensible server
# implementing the current HTTP standards.
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
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/apache/bin/apachectl
httpd=/usr/local/apache/bin/httpd
prog=httpd
pidfile=${PIDFILE-/var/run/httpd/httpd24.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure. So we just do it the way init scripts
# are expected to behave here.
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
# When stopping httpd, a delay (of default 10 second) is required
# before SIGKILLing the httpd parent; this gives enough time for the
# httpd parent to SIGKILL any errant children.
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d ${STOP_TIMEOUT} $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=6
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
# Force LSB behaviour from killproc
LSB=1 killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
if [ $RETVAL -eq 7 ]; then
failure $"httpd shutdown"
fi
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart|try-restart)
if status -p ${pidfile} $httpd >&/dev/null; then
stop
start
fi
;;
force-reload|reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
RETVAL=2
esac
exit $RETVAL
-----------------------------------分割线-------------------------------------
LAMP: Linux + Apache +Mysql +Php
a: apache
m: mariadb, mysql
p: php, perl, python
LAMMP: memcached
静态资源:静态内容;客户端从服务器获得的资源的表现形式与原文件相同;
动态资源:通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端;
当客户端访问动态资源的时候,比如访问的是www.xxxx.com/search.php?id=8,这时候httpd并不能直接处理该请求,而是将该请求交予php模块处理,php模块处理完成之后,将结果返回给httpd,httpd把结果封装到响应报文中。httpd和php模块之间的交互和协议就称之为CGI,通用网关接口。
CGI: Common Gateway Interface
fastcgi:
httpd+php: httpd和php组合的方式 有3种形式:
modules 模块形式
cgi cgi形式
fastcgi(fpm) fastcgi形式
请求流程:Client --> (http协议) --> httpd --> (cgi协议) --> application server (program file) --> (mysql) --> mariadb
请求流程的文字解析:客户端浏览器通过httpd协议发送请求报文给服务器端的httpd程序,如果该请求是请求动态资源的,httpd程序通过CGI协议调用application server程序运行起来,处理该请求,如果该请求还涉及存取数据库的数据,application server程序则要链接数据库服务,存取数据库上的文件来完成客户端的请求。
CentOS 7上使用LAMP组合需要用到的软件包:
程序包:httpd, php, php-mysql, mariadb-server,mariadb
注意:php要求httpd使用prefork MPM,php-mysql包是php连接mysql的驱动
启动服务:
systemctl start httpd.service
systemctl start mariadb.server
CentOS 6上使用LAMP组合需要用到的软件包:
程序包:httpd, php, php-mysql, mysql-server,mysql
启动服务:
service httpd start
service mysqld start
测试LAMP环境
先安装上面的软件包:yum -y install httpd php php-mysql mariadb-server
php程序执行环境:
test.php
<?php
phpinfo();
?>
测试php程序与mysql通信
test2.php
<?php
$conn = mysql_connect('HOST:PORT','USERNAME','PASSWORD');
if ($conn)
echo "OK";
else
echo "Failure";
mysql_close();
?>
wordpress的安装和使用:
到 https://cn.wordpress.org/wordpress-4.8.1-zh_CN.zip 下载wordpress
unzip wordpress-4.8.1-zh_CN.zip 解压
cp -a wordpress /var/www/html 复制到/var/www/html/目录下
cd /var/www/html/wordpress
cp wp-config-sample.php wp-config.php
编辑wp-config.php文件:设置数据库相关信息
define('DB_NAME', 'wpdb'); 数据库名为wpdb
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser'); 数据库用户
/** MySQL数据库密码 */
define('DB_PASSWORD', 'wppasswd'); 数据库密码
/** MySQL主机 */
define('DB_HOST', '127.0.0.1'); 数据库服务主机的ip地址
/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8');
/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');
GRANT ALL ON wpdb.* TO 'wpuser'@'localhost' IDENTIFIED BY 'wppasswd';
GRANT ALL ON wpdb.* TO 'wpuser'@'127.0.0.1' IDENTIFIED BY 'wppasswd';
CREATE DATABASE wpdb;
FLUSH PRIVILEGES;
使用浏览器访问:http:192.168.62.159/wordpress 设置wordpress的相关信息:
站点标题:个人web技术分享
用户名:wpadmin
密码:wpadmin
点击 安装wordpress 即可完成。
phpMyAdmin的安装和使用:
phpMyAdmin: mariadb的WebGUI
php解释器如何与MariaDB交互:
解释器无须与MariaDB交互,那些用到数据存储系统的程序才需要与数据存储系统交互;
存储系统的分类:
文件系统:文件
SQL:MariaDB, Oracle, MSSQL, ...
NoSQL:redis, mongodb, hbase, ...
NewSQL:
关于PHP
一、PHP简介
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程序了,这即是PHP 1.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性能的改进。
二、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的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。
三、PHP的Opcode
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):
1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)
2、Parsing —— 将Tokens转换成简单而有意义的表达式
3、Compilation —— 将表达式编译成Opocdes
4、Execution —— 顺次执行Opcodes,每次一条,从而实现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 Centos7的rpm包名为php-xcache
快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/
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
五、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相关的脚本。
------------------------------分割线---------------------------------------------------
回顾:
httpd+php组合的形式有3种:
modules 模块形式
httpd prefork: libphp5.so
httpd event or worker: libphp5-zts.so
cgi cgi形式
fpm fast-cgi形式
php: www.php.net
php: zend engine,
生成opcode
excute opcode
php:
php解释器
php的配置文件:/etc/php.ini, /etc/php.d/*.ini (rpm -qc php-common)
配置文件(php.ini)在PHP启动时被读取。对于服务器模块版本的PHP,仅在web服务器启动时读取一次。对于CGI和CLI 版本,每次调用都会读取。
php.ini文件的格式:
[Foo]: Secion Header
directive = value
; 分号表示注释符;
php.ini核心配置选项:http://php.net/manual/zh/ini.core.php
php.ini配置选项列表:http://php.net/manual/zh/ini.list.php
mariadb(mysql):
数据结构模型:层次模型、网状结构、关系模型
关系模型:二维关系:row, column
数据库管理系统:DBMS
关系数据库管理系统:Relational,RDBMS
补充材料:RDMBS设计范式基础概念
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
(1) 第一范式(1NF)
所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。
(2) 第二范式(2NF) 每个表的记录都有唯一主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。
(3) 第三范式(3NF)
第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。
RDBMS:
MySQL: MySQL, MariaDB, Percona-Server
PostgreSQL: 简称为pgsql --> EnterpriseDB
Oracle:
MSSQL:
SQL语句的处理过程如下图:
数据库的事务:多个操作被当作一个整体对待
ACID:
A: 原子性;
C:一致性;
I: 隔离性;
D:持久性;
SQL: Structure Query Language 结构化查询语言;
SQL解释器:
数据存储协议:应用层协议,C/S
S:server, 监听于套拼字,接收并处理客户端的应用请求;
C:Client,发送sql请求。客户端有CLI(命令行接口)和GUI(图形界面接口)。应用编程接口,比如ODBC:Open DataBase Connection。
数据库的基本概念:
约束:constraint,向数据表提供的数据要遵守的限制;(包括主键,唯一键,外键,检查性等)
主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL;一个表只能存在一个
唯一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL; 一个表可以存在多个
外键:一个表中的某字段可填入数据取决于另一个表的主键已有的数据;
检查性约束
索引:将表中的一个或多个字段中的数据复制一份另存,并且此些需要按特定次序排序存储;
关系运算:
选择:挑选出符合条件的行(部分);
投影:挑选出需要的字段;
连接:表示多表连接,join,left join,right join
数据库中的数据的抽象:
物理层:决定数据的存储格式,即RDBMS在磁盘上如何组织文件;
逻辑层:描述DB存储什么数据,以及数据间存在什么样的关系;
视图层:描述DB中的部分数据;表示只只关心的逻辑数据(可能是多表连接等等各种方式产生的数据)
关系模型的分类:
关系模型
实体-关系模型
基于对象的关系模型
半结构化的关系模型
安装MySQL的形式:
源代码:编译安装
二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
程序包管理管理的程序包:rpm包和deb包
MariaDB的特性:
插件式存储引擎:存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择;
存储引擎也称之为“表类型”;
(1) 更多的存储的存储引擎
mysql的MyISAM存储引擎 --> 对应MariaDB的Aria存储引擎,
mysql的InnoDB存储引擎 --> 对应MariaDB的XtraDB存储引擎
(2) 诸多扩展和新特性
(3) 提供了较多测试组件
(4) truly open source
安装和使用MariaDB
CentOS 7直接提供;
CentOS 6中安装通用二进制格式的MariaDB的方式如下:
下载链接:
wget -c "https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-5.5.58/bintar-linux-x86_64/mariadb-5.5.58-linux-x86_64.tar.gz"
(1) 准备数据目录,可以把数据放在btrfs文件系统上
以/mydata/data为例
mkdir -pv /mydata/data
chown -R mysql:myql /mydata/data
2) 配置mariadb
# groupadd -r -g 306 mysql 创建系统组mysql
# useradd -r -g 306 -u 306 mysql 创建系统用户mysql ,并加入mysql组
# tar xvf mariadb-5.5.58-linux-x86_64.tar.gz -C /usr/local 解压到/usr/local/目录
# ln -sv mariadb-5.5.58-linux-x86_64 /usr/local/mysql
# cd /usr/local/mysql
# chown -R root:mysql ./* 改变文件和目录的属主和属组
# scripts/mysql_install_db --datadir=/mydata/data --user=mysql
# cp supper-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
(3) 准备配置文件
配置格式:类ini格式,为各程序均通过单个配置文件提供配置信息;
[prog_name]
配置文件查找次序:
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf 其中--default-extra-file的选项为scripts/mysql_install_db --help可以查看
# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
/etc/mysql/my.cnf文件中[mysqld]段下添加如下三个选项: /etc/mysql/my.cnf文件每个选项为DBA
datadir = /mydata/data 数据库数据的存放目录
innodb_file_per_table = on 每张表都是用innodb存储引擎
skip_name_resolve = on 跳过名称解析
最后启动MariaDB:
service mysqld start 可能出现无法创建日志文件(/var/log/mysqld.log)的错误,解决方法,touch /var/log/mysqld.log && chown mysql:mysql /var/log/mysqld.log
MariaDB的程序组成:
Client:客户端
mysql:CLI交互式客户端程序;
mysqldump, mysqladmin...
Server:服务端
mysqld_safe
mysqld
mysqld_multi
服务器监听的两种socket地址:
ip socket: 监听在tcp的3306端口,支持远程通信;
unix sock: 监听在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),仅支持本地通信;server: localhost, 127.0.0.1
命令行交互式客户端程序mysql的使用:mysql
-uUSERNAME: 用户名;默认为root
-hHOST: 服务器主机; 默认为localhost
-pPASSWORD:用户的密码; 默认为空密码
注意:mysql用户账号由两部分组成:'USERNAME'@'HOST'; 其中HOST用于限制此用户可通过哪些主机远程连接mysql服务;支持使用通配符 %和_
%: 匹配任意长度的任意字符;比如172.16.0.0/16, 172.16.%.%
_: 匹配任意单个字符;
具体查看MySQL的mysql数据库里的user表:可以看到mysql的账号使用user字段和host字段组成:
SELECT user,host,password from mysql.user;
/usr/local/mysql/bin/mysql_secure_installation:安全初始化程序,用来给mysql root用户设置密码,禁止root远程登录,删除匿名mysql用户等
mysql命令:分为客户端命令和服务器端命令
客户端命令:本地执行
mysql> help
每个命令都完整形式和简写格式;
status, \s status就是完整形式,\s就是简写格式
服务端命令:通过mysql协议发往服务器执行并取回结果
每个命令都必须命令结束符号;默认为分号;
例如: select version();
关系型数据库的常见组件:
数据库:database, mysql的一个数据库在文件系统上一般就是一个目录
表:table
行:row
列:column
索引:index
视图:view
用户:user
权限:privilege
存储过程:procedure
存储函数:function
触发器:trigger
事件调度器:event scheduler
SQL语句:分为DDL+DML
DDL: Data Defination Language 数据定义语言
CREATE, DROP, ALTER
DML: Data Manipulation Language 数据操作语言
INSERT, DELETE, UPDATE, SELECT
GRANT, REVOKE
数据库的简单使用:
创建数据库:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name;
删除数据库:
DROP DATABASE|SCHEMA [IF EXISTS] db_name;
CHARACTER SET 'charecter set name'
COLLATE 'collate name'
查看支持所有字符集:SHOW CHARACTER SET;
查看支持所有排序规则:SHOW COLLATION;
例如:CREATE DATABASE IF NOT EXISTS myblog CHARACTER SET 'utf8';
获取命令使用帮助:
mysql> HELP KEYWORD; 例如 HELP CREATE TABLE;
查看所有数据库:
mysql> SHOW DATABASES;
表的简单使用:
创建表:
CREATE TABLE [IF NOT EXISTS] tb_name (col1 datatype 修饰符, col2 datatype 修饰符) ENGINE=''
查看所有的引擎:SHOW ENGINES;
查看表:SHOW TABLES [FROM db_name]
查看表结构:DESC [db_name.]tb_name
删除表:
DROP TABLE [IF EXISTS] tb_name;
数据库的数据类型介绍:
字符型有如下几种:
定长字符型:CHAR(#), BINARY(#)
变长字符型: VARCHAR(#), VARBINARY(#)
对象存储:TEXT(不区分大小写)和BLOB(binary large object 区分字符大小写)
内置类型:ENUM(枚举)和SET(集合)
数值型:int,tinyint 1byte,smallint 2bytes,mediumint 3bytes,int 4bytes,bigint 8bytes,decimal(十进制类型),float, double
修饰符:
NOT NULL:非空约束
DEFAULT value: 设定默认值
评论
发表评论