文章目录
一、基本知识
1.php介绍
官方下载路径 http://www.php.net
php是一种服务器端的 HTML 脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。是一种广泛用于 Open Source(开放源代码)的尤其适合 Web 开发并可以嵌入 HTML 的多用途脚本语言。它的语法接近 C,Java 和 Perl,而且容易学习。该语言让 Web 开发人员快速的书写动态生成的网页。
PHP含义
早期PHP:Personal HomePage,Rasmus Lerdorf
后期PHP:PHP:Hypertext Preprocessor,超文本预处理器
PHP是一种脚本语言
编程语言:在执行前需要先进行编译的语言
脚本语言:是一种解释型语言
2.PHP能做什么
PHP什么都能做,但是很多情况下需要借助其他插件。
PHP是做动态网站的。(web)
web1.0:静态网站(都是请求已经存在的静态页,不需要和数据库进行任何交互),通常请求文件都是以路径+文件名.html/htm
web2.0:动态网站,用户能够与服务器进行交互(服务器能够与数据库进行交互)
PHP负责处理用户提交的请求,与数据库进行关联,由PHP操作数据库进行数据的交互。
3.web工作原理:****重要
网站:多个网页组成的集合。
用户访问:http://www.itcast.cn/teacher.html(URL:互联网的绝对路径)
网站管理员:一个网站就是一个文件夹(本地的绝对路径)
静态页的请求:http://localhost/index.html
请求步骤:
1.用户在浏览器中输入需要访问的网站的域名以及具体要请求的网页文件
2.域名解析(原理):先找本地hosts文件,再找互联网上的DNS
3.web服务器接收请求,获取请求文件index.html
4.web服务器返回index.html
5.浏览器解析html代码,显示数据
动态页的请求:http://localhost/index.php
请求步骤:
1.用户在浏览器中输入需要访问的网站的域名以及具体要请求的网页文件
2.域名解析:先找本地hosts文件,再找互联网上的DNS
3.web服务器接收请求,获取请求文件index.php
4.将index.php文件交给php引擎处理
5.php引擎解析php代码,如果要连接数据库的话就调用mysql扩展,去操作数据库,最终解析完变成html文件
6.php引擎将生成的html文件交给Apache
7.web服务器返回index.php得到的最终html文件
8.浏览器解析html代码,显示数据
4.PHP脚本主要用于领域
服务端脚本
这是PHP最传统,也是最主要的目标领域。开展这项工作需要具备以下三点:PHP解析器(CGI或者无服务器模块)、web服务器和web浏览器。需要在运行web服务器时,安装并配置PHP,然后,可以用web浏览器来访问PHP程序的输出,即浏览服务器端的PHP页面。如果只是实验PHP编程,所有的这些都可以运行在自己家里的电脑中。
命令行脚本
可以编写一段PHP脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,仅仅需要PHP解析器来执行。这种用法对于依赖cron(Unix或者Linux环境)或者Task Scheduler(Windows环境)的日常运行脚本来说是理想的选择。这些脚本也可以用来处理简单的文本。
编写桌面应用程序
对于有这图形界面的桌面应用程序来说,PHP或许不是一种最好的语言,但是如果用户非常精通PHP,并且希望在客户端应用程序中使用PHP的一些高级特性,可以利用PHP-GTK来编写这些程序。用这种方法,还可以编写跨平台的应用程序。PHP-GTK是PHP的一个扩展,在通常发布的PHP包中并不包含它。
5.php其他相关信息
PHP能够在所有的主流操作系统上使用,包括Linux、Unix的各种变种(包括HP-UX、Solaris和OpenBSD)、Windows、Mac OS X 、RiSC OS等。对于大多数的服务器,PHP提供了一个模块;还有一些PHP支持CGI标准,使得PHP能够作为CGI处理器来工作。
使用PHP,可以自由的选择操作系统和web服务器。同时,还可以在开发时选择使用面向过程和面向对象,或者两者混合的方式来开发。PHP4不支持OOP的所有的标准,PHP5弥补了PHP4的这一弱点,引入了完全的对象模型。
使用PHP,并不局限于输出HTML。PHP还能被用来动态输出图像、PDF文件甚至Flash动画(使用libswf和Ming)。还能够非常简便的输出文本,例如XHTML以及任何其他形式的XML文件。PHP能够自动生成这些文件,在服务端开辟出一块动态内容的缓存,可以直接把它们打印出来,或者将它们存储到文件系统中。
PHP最强大最显著的特性之一,是它支持很大范围的数据库。使用任何针对某数据库的扩展(例如mysql)编写数据库支持的网页非常简单,或者使用抽象层如PDO,或者通过ODBC扩展连接到任何支持ODBC标准的数据库。其他一些数据库也可能会用cURL或者sockets,例如CouchDB。
PHP还支持利用诸如LDAP、IMAP、SNMP、NNTP、POP3、HTTP 、COM(Windows环境)等不计其数的协议的服务。还可以开放原始网络端口,使得任何其他的协议能够协同工作。PHP支持和所有的web开发语言之间的WDDX复杂数据交换。关于相互连接,PHP已经支持了对Java对象的即时连接,并且可以透明的将其作用PHP对象。
PHP具有极其有效的文本处理特性,包括Perl兼容正则表达式(PCRE)以及许多扩展和工具可用于解析和访问XML文档。PHP将所有的XML功能标准化于坚实的libxml2扩展,并且还增加了SimpleXML,XmlReader以及XMLWriter支持以扩充其功能。
6.memcache介绍
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
Memcache官方网站:http://memcached.org/
核心优化概述
什么是优化:以更小的资源支持更大负载网站的运行,以小博大。
思路:尽量减少用户等待时间,节省系统资源开销,节省带宽使用。
优化的三方面:Memcache内存缓存技术、静态化技术、mysql优化
二、php的源码安装
1.php安装
官方下载路径 http://www.php.net
[root@server1 ~]# yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel
##解压软件
##systemd-devel解决--with-fpm-systemd依赖性
##一般通过yum search xml找--enable-xml依赖性
[root@server1 ~]# yum install -y oniguruma-6.8.2-1.el7.x86_64.rpm oniguruma-devel-6.8.2-1.el7.x86_64.rpm
通过阿里云或者清华下载站下载软件包##也是解决依赖性,两个包需同时安装
[root@server1 ~]# tar xf php-7.4.12.tar.bz2 ##解压
[root@server1 ~]# cd php-7.4.12/
[root@server1 php-7.4.12]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc
--enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib
--with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap
--enable-inline-optimization --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring
--enable-bcmath --with-fpm-systemd
--enable-soap ##动态模块,以上策略根据公司需求添加
[root@server1 php-7.4.12]# make
[root@server1 php-7.4.12]# make install ##完成编译三部曲
2.php配置
编译完成之后我们进行启动
首先将php服务复制到系统默认的启动目录中
[root@server1 php-7.4.12]# cd /usr/local/php/etc
将default模板文件复制为系统能够识别的conf文件
[root@server1 etc]# cp php-fpm.conf.default php-fpm.conf
[root@server1 etc]# vim php-fpm.conf
去掉注释
pid = run/php-fpm.pid
[root@server1 etc]# cd php-fpm.d/
拷贝主配置文件,但不用修改(监听端口在此目录可修改)
[root@server1 php-fpm.d]# cp www.conf.default www.conf
[root@server1 ~]# cd php-7.4.12/
将php.ini生产环境复制到系统的默认目录下
[root@server1 php-7.4.12]# cp php.ini-production /usr/local/php/etc/php.ini
[root@server1 php-7.4.12]# vim /usr/local/php/etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Aisa/Shanghai #修改时区
[root@server1 php-7.4.12]# cd sapi/fpm
[root@server1 fpm]# cp php-fpm.service /usr/lib/systemd/system
复制到启动脚本目录
关闭php服务的下面这个选项,因为开启之后会将许多目录设置为只读,由于系统要写入文件来开启服务,所以我们要给他添加权限,不能让它只读
[root@server1 fpm]# vim /usr/lib/systemd/system/php-fpm.service
注释此行
#ProtectSystem=full
[root@server1 fpm]# systemctl daemon-reload
[root@server1 fpm]# systemctl start php-fpm.service
测试:启动服务,查看9000端口,发现存在,说明服务已经启动
[root@server1 fpm]# netstat -antlp|grep :9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 24709/php-fpm: mast
[root@server1 fpm]# systemctl enable php-fpm
一般我们不会直接访问9000端口,因为并发能力较差,且nginx并发性强,所以需要nginx整合后使用
三、nginx与php整合
[root@server1 sapi]# cd /usr/local/nginx/conf/
[root@server1 conf]# vim nginx.conf ##对nginx.conf中的内容进行修改
...
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
[root@server1 conf]# nginx -s reload
nginx判断访问的地址为.php结尾,会访问PHP
在html下新建一个index.php,在里边写入函数(此函数用来查看PHP信息),我们在浏览器访问我们这个页面就可以看到相应的内容
[root@server1 conf]# vim /usr/local/nginx/html/index.php
<?php
phpinfo()
?>
测试: http://192.168.117.11/index.php
rpm安装和源码安装PHP只能使用其中之一
添加php环境变量
我们新加入一个memcache模块,当我们想要使用phpize脚本的时候会发现用不了,但是它php里边存在,这是因为系统的环境变量没有检测到它,我们就要修改环境变量
[root@server1 ~]# vim .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/php/bin
export PATH
[root@server1 ~]# source .bash_profile
[root@server1 ~]# which php ##查看环境变量,看到加入成功就可以继续
/usr/local/php/bin/php
四、php动态扩展模块:memcache模块
我们新加入一个memcache模块,当我们想要使用phpize脚本的时候会发现用不了,但是它php里边存在,这是因为系统的环境变量没有检测到它,我们就要修改环境变量
memcache的作用是做高速缓存,因为它是运行在物理内存中,所以我们要是从memcache中取数据,那么速度会比从数据库中取数据快
当我们进行压测时候会发现,这种方式来处理数据效率会非常高,几乎没有报错出现
[root@server1 ~]# tar xf memcache-4.0.5.2.tgz
[root@server1 ~]# cd memcache-4.0.5.2/
[root@server1 memcache-4.0.5.2]# yum install -y autoconf ##安装自动配置
[root@server1 memcache-4.0.5.2]# phpize
Configuring for:
PHP Api Version: 20190902
Zend Module Api No: 20190902
Zend Extension Api No: 320190902
[root@server1 memcache-4.0.5.2]# ./configure
[root@server1 memcache-4.0.5.2]# make
[root@server1 memcache-4.0.5.2]# make install
[root@server1 memcache-4.0.5.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/
memcache.so opcache.a opcache.so
[root@server1 memcache-4.0.5.2]# php -m |grep memcache ##没有memcache模块,刚刚的操作只是静态的cp至目录
[root@server1 memcache-4.0.5.2]# cd /usr/local/php/etc
[root@server1 etc]# vim php.ini
extension=memcache #添加memcache模块,让memcache可读,910行左右
[root@server1 etc]# systemctl reload php-fpm
[root@server1 etc]# php -m |grep memcache ##已有memcache模块
memcache
[root@server1 etc]# cd /root/memcache-4.0.5.2
[root@server1 memcache-4.0.5.2]# cp example.php memcache.php /usr/local/nginx/html/
##example.php测试文件;memcache.php为监控页面,测试时可以看到内存的缓存状态
[root@server1 memcache-4.0.5.2]# cd /usr/local/nginx/html/
[root@server1 html]# yum install -y memcached
[root@server1 html]# systemctl enable --now memcached
[root@server1 html]# netstat -antlp|grep :11211
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 27984/memcached
tcp6 0 0 :::11211 :::* LISTEN 27984/memcached
[root@server1 memcache-4.0.5.2]# cd /usr/local/nginx/html/
[root@server1 html]# vim memcache.php ##为监控页面,测试时可以看到内存的缓存状态
$VERSION='$Id$';
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','westos'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
测试:
访问http://192.168.117.11/example.php,多刷新几次页面
查看缓存命中状态
http://192.168.117.11/memcache.php
下图可以查看缓存命中率,都是从内存命中
访问index.php和example.php进行对比
http://192.168.117.11/example.php页面的代码逻辑是访问memcache,不会去读盘,直接从内存里命中
http://192.168.117.11/index.php不断需要后端PHP解析完成访问
Failed失败表示超过处理能力
除了用内存,用PHP的memcache模块连接memcache程序,把数据写到memcache中,memcache是内存;
另一种方法,通过反向代理将php结尾的请求,反向交给负载均衡列表,从而解决PHP处理能力;
传统缓存逻辑如上图
处理能力由后端的9000端口处决定!更好的办法是把数据缓存到nginx中,即把memcache放到nginx层面中(见下一节总结)