PHP:Hypertext Preprocessor超文本预处理器的缩写,是一种被广泛应用的开发源代码的多用途脚本语言,它可以嵌套在HTML中,尤其是web开发。
PHP代码块被包含在特殊的起始符和结束符中的。
PHP功能:
1.服务端脚本是其主要领域,具有这项工作需要PHP解析器(CGI或服务器模块)、web服务器、web浏览器支持。
2.命令行脚本,编写一段php脚本,不需要任何服务器和浏览器来运行它,仅仅需要php解析器来执行。
3.应用程序,通过PHP-GTK来编写。
今天是搭建php来为今后的LNMP做个准备,所以我们的用途是web。
一些基本概念~
CGI:通用网关接口,为http服务器和其他机器上的程序服务通信交流的一种工具,CGI需要运行在网络服务器上。
传统CGI缺点:性能差,每次HTTP服务器遇到动态程序时都需要通过重新启动解析器来执行解析,之后结果才会被返回给HTTP服务器,这在处理高并发访问时几乎是不可用的。
FastCGI:是一个可伸缩、高速的HTTP服务器和动态脚本语言之间通信的接口,在unxi下是FastCGI的接口是socket,主要优点是将动态语言和HTTP服务器分离出来。流行的HTTP服务器都支持FastCGI。
FastCGI接口采用C/S结构。当http服务器遇到动态程序时,直接交付给FastCGI进程来执行,结果返回给浏览器,HTTP服务器可以专一的处理静态请求、将动态脚本服务器的结果返回给客户端,提升整体新能。
FPM:FastCGI进程管理器,对高负载网站有很大帮助。功能有:支持平滑停止/启动、可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件、
stdout 和 stderr 日志记录、在发生意外情况的时候能够重新启动并缓存被破坏的 opcode、支持文件上传优化、慢日志、fastcgi_finish_request()- 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等)、动态/静态子进程产生、基本 SAPI 运行状态信息(类似Apache的 mod_status)、基于 php.ini 的配置文件。
连接器(Connector):在mysql文档中指出,连接器是允许应用程序连接到MySQL服务器的一个软件,mysql提供了多数语言的连接器,包括php。
应用程序与数据库通信,需要编写php代码执行连接数据服务器、查询数据库、与数据库相关的其他活动,需要软件来提供php应用程序使用api。此软件称为连接器,允许应用程序连接到数据库服务器。
Driver:驱动是一段设计用来于一种特定类型的数据库服务器进行交互的软件代码。驱动可能会调用一些库,比如MySQL客户端库或者MySQL Native驱动库。 这些库实现了用于和MySQL数据库服务器进行交互的底层协议。
扩展:在php文档中指出php代码由核心组成,具有核心功能的可选扩展。php的MySQL扩展是使用php扩展框架实现的。扩展通常会向程序员公开api以允许编程方式使用工具或者不公开api。
API:应用程序变编程接口或API定义应用程序需要调用的类、方法、函数和变量,以执行所需要的任务。对于需要与数据库通信的php应用程序,必要的API通常通过PHP扩展来实现。
API可以是程序性的或者面向对象的。使用过程api可以调用函数来执行任务,使用面向对象api可以通过api实例化类,然后在结果对象上调用方法。
在编写需要连接到MySQL服务器的PHP应用程序时,有3个api选项(扩展)可用:
1.php的mysql扩展:允许开发与mysql数据库交互的PHP应用程序,仅适用于mysql4.3.1以下版本,此扩展提供一个过程api;
通常扩展位于源码包路径下/ext/mysql中。(ext表示Extended file system 延伸文件系统,简称ext)。
2.php的mysqli扩展:mysql的更新改进扩展,允许我们访问MySQL 4.1及以上版本提供的功能,此扩展包含在php5以上版本,此mysqli扩展改进 面向对象的api、支持多语句、增强调试功能等等。
通常扩展位于源码包路径下/ext/mysqli中。
3.php的数据对象pdo:pdo:PHP Data Objects简写,用于php应用程序的数据库抽象层。无论应用程序连接到哪种类型的数据库,pdo都会将php应用程序提供一致的api。
通常扩展位于源码包路径下/ext/pdo中。
驱动程序:
pdo_mysql 驱动程序:pdo_mysql是一个实现PHP数据对象(PDO)接口的驱动程序,用于实现从PHP到MySQL数据库的访问。
mysqlnd驱动程序:为了与mysql服务器通信,mysqli和pdo_mysql各自使用一个实现所需协议的库。过去唯一使用的库是mysql客户端库称为libmysqlclient。libmysqlclient未针对php应用程序的通信做优化,故而mysqlnd(mysql native本机本地 driver)被开发。MySQL Native Driver是使用PHP扩展框架实现的,位于源码包路径下ext/mysqlnd。它不会向PHP程序员公开API。只能与MySQL服务器版本4.1.3及更高版本一起使用。
mysqlnd不提供api,提供api的是扩展(mysqli和pdo),这些扩展使mysqlnd和mysql server进行通信。
mysqli扩展是在PHP 5.0.0版本中引入的。mysqlnd驱动程序包含在PHP 5.3.0版中。
从应用的层面(上层)来看,通过php的mysql和mysqli扩展提供的API去操作数据库;
从底层来看,mysqlnd提供了底层和数据库交互的支持(和mysql数据库进行网络协议交互);
在linux上安装:
通常安装php使用二进制版本安装,这些二进制版本是在支持mysql扩展下构建的,但扩展库需要附加软件包进行安装。
从源代码构建PHP可以指定要使用的MySQL扩展,以及为每个扩展选择客户端库。mysqlnd驱动程序是推荐的客户端库,因为它可以提高性能并允许访问使用MySQL客户端库时不可用的功能。
PHP5.4以上版本默认的客户端库使用mysqlnd、选项配置–with-mysqli 。
扩展和客户端库可自由组合使用。如下:
./configure
–with-mysql=mysqlnd #使用mysql扩展并使用mysqlnd官方驱动程序
–with-mysqli=mysqlnd #使用mysqli扩展并使用mysqlnd官方驱动程序
–with-pdo-mysql=mysqlnd #使用pdo扩展并使用mysqlnd官方驱动程序
安装FastCGI,在编译安装php时加入 –enable-fpm配置选项来激活FPM支持。
1.需要先检查是否安装nginx和mysql
[root@WebA-136 ~]# netstat -anlutp | egrep "mysql|nginx"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4547/nginx
tcp 0 0 :::3306 :::* LISTEN 5891/mysqld
[root@WebA-136 ~]#
2.检查依赖库,检查后linux只默认安装了zlib-devel库,记得安装以下包哦~
[root@WebA-136 ~]# rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel
zlib-devel-1.2.3-29.el6.x86_64
[root@WebA-136 ~]#
居然yum源里没有libiconv-devel库,需要手动安装
[root@WebA-136 ~]#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
[root@WebA-136 ~]# tar xf libiconv-1.15.tar.gz -C /usr/local/src/
[root@WebA-136 libiconv-1.15]# mkdir /usr/local/libiconv
[root@WebA-136 libiconv-1.15]# ./configure –prefix=/usr/local/libiconv
[root@WebA-136 libiconv-1.15]# make && make install
3.安装epel源和libmcrypt库(对程序运行时添加/移除算法有帮助)、mhash库
[root@WebA-136 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyum.com/repo/epel-6.repo
[root@WebA-136 ~]# yum install libmcrypt-devel mhash -y
4.安装mcrypt加密扩展库
[root@WebA-136~]#yuminstallmcrypt-y
5.执行./configure,一定要加入-enable-fpm配置选项来激活FPM支持的
./configure
–prefix=/usr/local/php7.2.5 #安装位置
–enable-mysqlnd #使用mysqlnd
–with-mysqli=mysqlnd #使用mysqli扩展并使用mysqlnd官方驱动程序
–with-pdo-mysql=mysqlnd #使用pdo mysql扩展并使用mysqlnd官方驱动程序
–with-iconv-dir=/usr/local/libiconv #使php支持iconv函数,用于字符编码强制转换
–with-freetype-dir #打开对freetype字体库的支持
–with-jpeg-dir #打开对jpeg图片支持
–with-png-dir #打开对png图片支持
–with-zlib #打开对zlib库支持
–with-libxml-dir #打开对libxml支持
–enable-xml #支持xml扩展
–disable-rpath #关闭额外的运行库文件
–enable-bcmath #使用bcmath扩展,打开图片大小调整,在zabbix监控会用到
–enable-shmop
–enable-sysvsem
–enable-inline-optimization
–with-curl #打开对curl工具的支持
–enable-mbregex
–enable-fpm #打上PHP-fpm 补丁后才有这个参数,CGI方式安装的启动程序
–enable-mbstring #多字节支持
–with-mcrypt=/usr/local/mcrypt #php7.2.5已废弃此选项
–with-gd #对gd库的支持
–enable-gd-native-ttf #php7.2.5已废弃此选项
–with-openssl #对openssl的支持
–with-mhash #算法支持
–enable-pcntl # freeTDS需要用到的,可能是链接mysql用到
–enable-sockets #打开socket的支持
–with-xmlrpc #打开xml-rpc的c语言
–enable-soap
–enable-short-tags
–enable-static
–with-xsl #打开XSLT 文件支持,扩展了libXML2库 ,需要libxslt软件
–with-fpm-user=www #运行fpm的用户
–with-fpm-group=www #运行fpm的组名
–enable-ftp #打开ftp的支持
–enable-opcache=no
其中与fpm有关的选项是:
–enable-fpm
–with-fpm-user=www 设置 FPM 运行的用户身份(默认nobody)
–with-fpm-group=www 设置 FPM 运行时的用户组(默认nobody)
–with-fpm-systemd 启用 systemd 集成 (默认no)
–with-fpm-acl 使用POSIX访问控制列表 (默认no)
编译前需要做link
[root@WebA-136 php-7.2.5]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
[root@WebA-136 php-7.2.5]# touch ext/phar/phar.phar
[root@WebA-136 php-7.2.5]# make && make install
拷贝php.ini配置文件
[root@WebA-136 php]# cp /usr/local/src/php-7.2.5/php.ini-production /usr/local/php/lib/php.ini
[root@WebA-136 php]# cd /usr/local/php/etc/php-fpm.d
[root@WebA-136 php-fpm.d]# cp www.conf.default www.conf
[root@WebA-136 ~]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
启动php并查看
[root@iZ2ze4vbp6wu2etcksvay7Z php]# ./sbin/php-fpm
[root@iZ2ze4vbp6wu2etcksvay7Z php]# lsof -i :9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 7677 root 7u IPv4 261689 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7678 www 0u IPv4 261689 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7679 www 0u IPv4 261689 0t0 TCP localhost:cslistener (LISTEN)
[root@iZ2ze4vbp6wu2etcksvay7Z php]# netstat -anltup | grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 7677/php-fpm
[root@iZ2ze4vbp6wu2etcksvay7Z php]#
我安装的是php7.2.5版本、linux是阿里云的服务器、nginx是1.14.2、mysql是5.6.40,过程中所遇到的问题如下:
1.virtual memory exhausted: Cannot allocate memory,虚拟内存用尽无法分配内存。
查看内存情况如下:
[root@iZ2ze4vbp6wu2etcksvay7Zphp]#free-m totalusedfreesharedbufferscached Mem:996895100053299 -/+buffers/cache:542453 Swap:000 [root@iZ2ze4vbp6wu2etcksvay7Zphp]#
解决方法:
[root@iZ2ze4vbp6wu2etcksvay7Zphp]#ddif=/dev/zeroof=/opt/swapbs=1024count=2048000 [root@iZ2ze4vbp6wu2etcksvay7Zphp]#mkswap/opt/swap [root@iZ2ze4vbp6wu2etcksvay7Zphp]#swapon/opt/swap 安装完php后执行 [root@iZ2ze4vbp6wu2etcksvay7Zphp]#swapoff/opt/swap
phpize的用法:手动编译安装php的扩展
增加pdo扩展(我的已经在安装php的时候已经增加此扩展了)
首先进去源码包pdo目录下
[root@iZ2ze4vbp6wu2etcksvay7Z ~]# cd /usr/local/src/php-7.2.5/ext/pdo
其次执行/usr/local/php/bin/phpize生成配置文件
[root@iZ2ze4vbp6wu2etcksvay7Zpdo]#/usr/local/php/bin/phpize Configuringfor: PHPApiVersion:20170718 ZendModuleApiNo:20170718 ZendExtensionApiNo:320170718 [root@iZ2ze4vbp6wu2etcksvay7Zpdo]#
再使用生成的配置文件./configure –with-php-config=/usr/local/php/bin/php-config –enable-pdo=share
[root@iZ2ze4vbp6wu2etcksvay7Zpdo]#./configure--with-php-config=/usr/local/php/bin/php-config--enable-pdo=share
最后执行make &&make install编译安装
[root@iZ2ze4vbp6wu2etcksvay7Zpdo]#make&&makeinstall
成功则出现
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/
Installing header files: /usr/local/php/include/php/
Installing PDO headers: /usr/local/php/include/php/ext/pdo/
说明在/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/目录下生成了pdo.so文件.
增加pdo_mayslq((我的已经在安装php的时候已经增加此扩展了)),进入源码包pdo_mysql目录下,执行/usr/local/php/bin/phpize生成配置文件
[root@iZ2ze4vbp6wu2etcksvay7Zext]#cdpdo_mysql/ [root@iZ2ze4vbp6wu2etcksvay7Zpdo_mysql]#/usr/local/php/bin/phpize
再使用生成的配置文件–with-php-config=/usr/local/php/bin/php-config –with-pdo-mysql=/usr/local/mysql
[root@iZ2ze4vbp6wu2etcksvay7Zpdo_mysql]#./configure–with-php-config=/usr/local/php/bin/php-config–with-pdo-mysql=/usr/local/mysql
最后make &&make install编译安装
[root@iZ2ze4vbp6wu2etcksvay7Zpdo_mysql]#make&&makeinstall
成功则出现
Installing shared extensions:/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/
至此在此目录下已分别生成pdo.so文件和pdo_mysql.so文件.
最后切换到php安装目录下找到php.ini配置文件
[root@iZ2ze4vbp6wu2etcksvay7Z pdo_mysql]# vim /usr/local/php/lib/php.ini 增加两行: extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/ extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/pdo.so
需要重启php-fpm生效
FPM配置文件有php-fpm.conf和进程池配置文件两个。
[root@WebA-136php]#vimetc/php-fpm.conf 有全局配置段和线程池配置段两部分组成。
全局配置部分:
pid = string | PID文件的位置。默认为空 |
error_log = string | 错误日志的位置。默认:#INSTALL_PREFIX#/log/php-fpm.log。 如果设置为 "syslog",日志将不会写入本地文件,而是发送到 syslogd。 |
log_level = string | 错误级别。可用级别为:alert(必须立即处理),error(错误情况),warning(警告情况),notice(一般重要信息),debug(调试信息)。默认:notice。 |
syslog.facility = string | 设置何种程序记录消息,默认值:daemon |
syslog.ident = string |
为每条信息添加前缀。 如果在同一台服务器上运行了多个 FPM 实例,可以修改此默认值来满足需求。默认值:php-fpm。 |
emergency_restart_threshold =int |
如果子进程在 emergency_restart_interval 设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动。0 表示“关闭该功能”。默认值:0(关闭)。 |
emergency_restart_interval =mixed |
emergency_restart_interval 用于设定平滑重启的间隔时间。这么做有助于解决加速器中共享内存的使用问题。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)。 |
process_control_timeout =mixed |
daemonize =boolean 设置 FPM 在后台运行。设置“no”将 FPM 保持在前台运行用于调试。默认值:yes。 |
process.max =int | Fork的最大FPM进程数。使用动态管理进程数时,此设计可以控制在一个进程池内的全局进程数量。使用需谨慎,默认值:0。 |
process.priority =int | 设置master进程的 nice(2) 优先级(如果设置了此值)。 可以是 -19(最高优先级)到 20(更低优先级)。默认值:不设置。 |
daemonize =boolean | 设置 FPM 在后台运行。设置“no”将 FPM 保持在前台运行用于调试。默认值:yes。 |
rlimit_files =int | 设置master进程的打开文件描述符rlimit数。 |
rlimit_core =int | 设置master进程最大core的rlimit尺寸,默认值0。 |
events.mechanism =string | 设置FPM使用的事件机制。可用以下选项:select、pool、epoll、kqueue (*BSD)、port (Solaris)。 默认值:不设置(自动检测) |
systemd_interval =int | 使用systemd集成的FPM时,设置间歇秒数,报告健在通知给systemd。设置为0表示禁用。默认值10 |
线程池配置部分http://php.net/manual/zh/install.fpm.configuration.php
第一个php程序hello world。
helloworld ';>
在浏览器输入day/hello.php
此程序仅仅使用了php的echo语句显示了hello world。
继续从php获取系统信息,如下
输出正在使用的浏览器
echo$_SERVER['HTTP_USER_AGENT']; >
以及以下:
if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')!==FALSE){ echo'正在使用InternetExplorer。 '; } >
处理表单略过咯~