阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

部署lamp-php安装指南

163次阅读
没有评论

共计 9602 个字符,预计需要花费 25 分钟才能阅读完成。

一、PHP 介绍

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创的语法。它可以比 CGI 或者 Perl 更快速地执行动态网页。用 PHP 做出的动态页面与其他的编程语言相比,PHP 是将程序嵌入到 HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成 HTML 标记的 CGI 要高许多;PHP 还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

优点:灵活,上手快,易修改,发布快捷,环境好部署

PHP 主要用在服务器端上用于 Web 开发,约占网站总数的 80%。Facebook 最初使用的就是 PHP,PHP 在 WordPress 内容管理系统中扮演的角色让它很受欢迎。

官网

https://www.php.net

# 软件包获取

https://www.php.net/distributions/php-7.3.4.tar.bz2

二、PHP 安装

1)依赖包安装

[root@zutuanxue ~]# yum install gcc-c++ libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel gd net-snmp-*

libzip 版本低问题处理

libzip 要求 1.1 及以上,系统提供 1.0 需要升级

官方网站: https://libzip.org/

[root@zutuanxue ~]# wget https://libzip.org/download/libzip-1.5.2.tar.gz

[root@zutuanxue ~]# tar xf libzip-1.5.2.tar.gz

[root@zutuanxue ~]# cd libzip-1.5.2

[root@zutuanxue libzip-1.5.2]# mkdir build

[root@zutuanxue build]# cd build

[root@zutuanxue build]#cmake …

[root@zutuanxue build]#make

[root@zutuanxue build]#make install

2)配置

[root@zutuanxue ~]# tar xf php-7.3.4.tar.bz2

[root@zutuanxue php-7.3.4]# ./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc –with-mysqli=mysqlnd –enable-pdo –with-pdo-mysql=mysqlnd –with-iconv-dir=/usr/local/ –enable-fpm –with-fpm-user=www –with-fpm-group=www –with-pcre-regex –with-zlib –with-bz2 –enable-calendar –disable-phar –with-curl –enable-dba –with-libxml-dir –enable-ftp –with-gd –with-jpeg-dir –with-png-dir –with-zlib-dir –with-freetype-dir –enable-gd-jis-conv –with-mhash –enable-mbstring –enable-opcache=yes –enable-pcntl –enable-xml –disable-rpath –enable-shmop –enable-sockets –enable-zip –enable-bcmath –with-snmp –disable-ipv6 –with-gettext –disable-rpath –disable-debug –enable-embedded-mysqli –with-mysql-sock=/usr/local/mysql/

配置参数说明
---prefix=/usr/local/php                             安装路径
--with-config-file-path=/usr/local/php/etc   配置文件路径
--with-mysqli=mysqlnd --enable-embedded-mysqli --with-mysql-sock=/usr/local/mysql/      mysql 支持及客户端设置
--enable-pdo --with-pdo-mysql=mysqlnd                      开启 php pdo,PDO 一是 PHP 数据对象(PHP Data Object)的缩写
--with-iconv-dir=/usr/local/                         指定转码工具,各种字符集间的转换
--enable-fpm --with-fpm-user=www --with-fpm-group=www             支持 php-fpm,允许以服务的方式启动 PHP
--with-pcre-regex                             支持 pcre 正则表达式
--with-zlib --with-bz2  --with-zlib-dir  --enable-zip            支持压缩
--enable-calendar                             支持日历
--disable-phar                        PHAR (“Php ARchive”) 是 PHP 里类似于 JAR 的一种打包文件。如果你使用的是 PHP 5.3 或更高版本,那么 Phar 后缀文件是默认开启支持的.
--with-curl                                 支持 curl
--enable-dba                                 开启 dba 函数支持
--with-libxml-dir                             支持 xml 文件库 对 xml 读取和查询
--enable-ftp                                 支持 ftp
--with-gd --with-jpeg-dir --with-png-dir                  支持图片
--with-freetype-dir                             支持字库
--enable-gd-jis-conv                             支持 gd 库
--with-mhash --enable-mbstring                      支持加密
--enable-opcache=yes                             开启 opcache
--enable-pcntl                                             开启 PHP 进程控制支持   默认是关闭的
--enable-xml                                 允许 xml 文件
--disable-rpath                             关闭额外的运行库文件
--enable-shmop                                 开启 Shmop 是一个易用的允许 PHP 读取、写入、创建和删除 Unix 共享内存段的函数集
--enable-sockets                             打开 sockets 支持
--enable-bcmath                             增加 bcmath 扩展的支持,这是一个支持大整数计算的扩展。--with-snmp                                 支持 snmp
--disable-ipv6                                 关闭 IPV6 支持
--with-gettext                                 打开 gnu 的 gettext 支持,编码库用到
--disable-debug                              关闭调试模式

3)编译

[root@zutuanxue php-7.3.4]# make

4)安装

[root@zutuanxue php-7.3.4]# make install

5)拷贝一个配置文件

[root@zutuanxue php-7.3.4]# cp /usr/src/php-7.3.4/php.ini-production /usr/local/php/etc/php.ini

三、PHP 配置

关于 PHP 工作方式

  • 作为模块运行

  • 独立服务运行

1)作为 apache 模块运行

#if bind to apache

–with-apxs2=/usr/local/apache2/bin/apxs

AddType application/x-httpd-php .php

#if no mysql

./configure –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd

2)作为服务运行

思考问题 apache 如何将 PHP 请求交给 PHP 呢 PHP 是一门语言

    思路  CGI  fastcgi

CGI 公共网关接口 (COMMON GATEWAY INTERFACE),是一个协议

 它的作用就是帮助服务器与语言通信. 就是 apache 和 php 进行通信,因为 apache 和 php 的语言不通,因此需要一个沟通转换的过程,而 CGI 就是这个
 沟通的协议。

FastCGI 快速通用网关接口(FastCommonGatewayInterface), 是 CGI 的升级版,一种语言无关的协议,FastCGI 是用来提高 CGI 程序性能的

缺点:传统的 cgi 协议在每次连接请求时,会开启一个进程进行处理,处理完毕会关闭该进程,因此下次连接,又要再次开启一个进程进行处理,因此有多少个连接就有多少个 cgi 进程,这也就是为什么传统的 cgi 会显得缓慢的原因,因此过多的进程会消耗资源和内存。而 fast-cgi 则是一个进程可以处理多个请求,和上面的 cgi 协议完全不一样,cgi 是一个进程只能处理一个请求,这样就会导致大量的 cgi 程序,因此会给服务器带来负担。

php-fpm: 是一个实现了 FastCGI(协议)的程序

是 php 提供给 http 前端服务器 (web serve) 的 fastcgi 协议接口程序, 允许一个进程对多个连接进行处理,而不会立即关闭这个进程,而是会接着处理下一个连接。

PHP-CGI:PHP-CGI 是 php 自带的 Fast-CGI 管理器。

PHP-CGI 的不足:

php-cgi 变更 php.ini 配置后需重启 php-cgi 才能让新的 php-ini 生效,不可以平滑重启。

直接杀死 php-cgi 进程,php 就不能运行了。(PHP-FPM 和 Spawn-FCGI 就没有这个问题,守护进程会平滑从新生成新的子进程。)

PHP-FPM(FastCGI Process Manager:FastCGI 进程管理器)是一个 PHPFastCGI 管理器,对于 PHP 5.3.3 之前的 php 来说,是一个补丁包,旨在将 FastCGI 进程管理整合进 PHP 包中。如果你使用的是 PHP5.3.3 之前的 PHP 的话,就必须将它 patch 到你的 PHP 源代码中,在编译安装 PHP 后才可以使用。从 PHP 5.4 RC2 开始,php-fpm 已经转正了

PHP-FPM 特点

  1. listen:The address on which to accept FastCGI requests. 它支持 TCP Socket 和 unix socket 两种通讯协议。可设置 listen = [::]:9000。

  2. listen.allowed_clients:List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. 该配置项为逗号分隔的列表,如 listen.allowed_clients = 127.0.0.1,172.17.0.5。

  3. pm:Choose how the process manager will control the number of child processes. 该配置项设置 FPM 管理进程池的方式,包括 static、dynamic、ondemand 三种。

  4. pm.max_requests:The number of requests each child process should execute before respawning. This can be useful to work around memory leaks in 3rd party libraries. 设置每个子进程处理请求数的上限,对于处理第三方库中的内存泄漏很有用。

  5. pm.status_path:The URI to view the FPM status page. 支持状态页面监控 php-fpm

PHP-FPM 工作原理:

1、Web Server 启动时载入 FastCGI 进程管理器(IIS ISAPI 或 Apache Module)

2、FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程 (可见多个 php-cgi) 并等待来自 Web Server 的连接。

3、当客户端请求到达 Web Server 时,FastCGI 进程管理器选择并连接到一个 CGI 解释器。Web server 将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi。

4、FastCGI 子进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。当 FastCGI 子进程关闭连接时,请求便告处理完成。FastCGI 子进程接着等待并处理来自 FastCGI 进程管理器 (运行在 Web Server 中) 的下一个连接。在 CGI 模式中,php-cgi 在此便退出了。

在上述情况中,你可以想象 CGI 通常有多慢。每一个 Web 请求 PHP 都必须重新解析 php.ini、重新载入全部扩展并重初始化全部数据结构。使用 FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接 (Persistent database connection) 可以工作。

#php-fpm 服务设置 pool

每个 pool 可以监听不同的 sock、tcp/ip,pool 池是支持定义多个 pool 的。所有的网站使用同一个池,那其中一个网站发生一些故障,比如程序员写的一些程序有问题,就会把 php 资源耗尽,这样的结果就是其他站点的 php 也会 502。所以有必要把每一个站点隔离开。每个 pool 的名字要唯一。

PHP 服务配置

# 主配置文件

[root@zutuanxue var]# egrep -v "^;|^$" /usr/local/php/etc/php-fpm.conf [global] pid = run/php-fpm.pid error_log = log/php-fpm.log daemonize = yes include = /usr/local/php/etc/php-fpm.d/\*.conf

# 子配置文件

[root@zutuanxue var]# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf [root@zutuanxue var]# egrep -v "^;|^$" /usr/local/php/etc/php-fpm.d/www.conf [www] user = www group = www listen = 127.0.0.1:9000 listen.owner = www listen.group = www listen.mode = 0660 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3

# 全局配置文件

注释 # 全局配置 [global] # PID、可以不填 pid = /usr/local/php/var/run/php-fpm.pid # 错误日志路径、可以不填 error_log = /usr/local/php/var/log/php-fpm.log # www 虚拟主机配置、可写多个 # pool 命名:www [www] # 监听 socket 方式 # 可以写成 listen = 127.0.0.1:9000 listen = /tmp/php-fcgi.sock # 开启 php-fpm 的执行用户 user = www # 开启 php-fpm 的所属组 group = www # 监听 socket listen 的用户,和 web 服务器软件的一致 listen.owner = nobody # 监听 socket listen 的组,和 web 服务器软件的一致 listen.group = nobody # 怎样的形式启用进程 pm = dynamic # 最大开启子进程数 pm.max_children = 50 # 一开始启动多少子进程 pm.start_servers = 20 # 空闲时保留多少个子进程 pm.min_spare_servers = 5 # 最多空闲子进程 pm.max_spare_servers = 35 # 进程处理多少个请求之后销毁重建 pm.max_requests = 500 # 限定打开最大的文件数 rlimit_files = 1024

四、PHP 启动

[root@zutuanxue ~]# cp /usr/src/php-7.3.4/sapi/fpm/php-fpm.service /etc/systemd/system/

[root@zutuanxue ~]# systemctl daemon-reload

[root@zutuanxue ~]# systemctl enable php-fpm

[root@zutuanxue ~]# systemctl start php-fpm

五、相关知识补充

#mysqli 说明

MYSQL 也叫 Original MySQL,PHP4 版本的 MYSQL 扩展,从 PHP5 起已经被废弃,并别从 PHP7 开始已经被移除。

MYSQLI 叫做“MySQL 增强扩展”。

MYSQLND MYSQL NATIVE DIRVER 叫做 MYSQL“官方驱动”或者更加直接点的叫做“原生驱动”

PDO PHP Data Objects PHP 数据对象,是 PHP 应用中的一个数据库抽象层规范。

#opcache

原理:

其实非常简单,opcache 只是把把 PHP 执行后的数据(opcode)缓存到内存中从而避免重复的编译过程,能够直接使用缓冲区已编译的 opcode 代码从而提高速度,降低服务器负载

** 效果: ** 在实际应用当中能使 QPS 数大致增加 3 倍以上

注意:

启用 opcache 后,典型的问题就是由于 opcache 的缓存加速机制导致的代码变更后无法立即看到效果。php 代码被转换成可立即执行的“机器码”后会有一定的缓存时间后才会去检查原始的 PHP 文件是否变动过,具体视配置项 opcache.revalidate_freq 设置的秒数情况而定;这样就会导致某些情况下明明更新了 PHP 文件中的代码,但执行后却看不到改变后的效果,这就是因为 opcache 检查 php 文件变动的间隔时间尚未结束所导致。这个问题并不是 bug,而要视具体生产环境来设定 opcache.revalidate_freq 值,倘若 php 代码很少变动,建议该值设置的大一些,可减少 opcahce 由于检查 php 文件变动而带来的额外开销,比如 7200 那么在变动 php 文件后如何才能快速降低 opcache 缓存带来的这种问题呢?最简单的方法就是更新代码后重启下 php-fpm(nginx fast-cgi 模式)或 apache(apache-handler 模式)。当然还可以自己书写一个 php 脚本,调用 opcache_reset()函数重置所有 opcache 缓存字节码,或者使用 opcache_invalidate(PHPfileDir,true)重置指定 php 文件的缓存字节码。

opcache 配置指令详解

[Zend Opcache] zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/opcache.so opcache.enable=1 ; 启用操作码缓存 opcache.enable_cli=1 ; 仅针对 CLI 环境启用操作码缓存 opcache.memory_consumption=128 ; 共享内存大小,单位 MB opcache.interned_strings_buffer=8 ; 存储临时字符串的内存大小,单位 MB opcache.max_accelerated_files=4000 ; 哈希表中可存储的脚本文件数量上限 ;opcache.max_wasted_percentage=5 ; 浪费内存的上限,以百分比计 ;opcache.use_cwd=1; 附加改脚本的工作目录, 避免同名脚本冲突 opcache.validate_timestamps=1 ; 每隔 revalidate_freq 设定的秒数 检查脚本是否更新 opcache.revalidate_freq=60 ; ;opcache.revalidate_path=0 ; 如果禁用此选项,在同一个 include_path 已存在的缓存文件会被重用 ;opcache.save_comments=1 ; 禁用后将也不会加载注释内容 opcache.fast_shutdown=1 ; 一次释放全部请求变量的内存 opcache.enable_file_override=0 ; 如果启用,则在调用函数 file_exists(),is_file() 以及 is_readable() 的时候,都会检查操作码缓存 ;opcache.optimization_level=0xffffffff ; 控制优化级别的二进制位掩码。;opcache.inherited_hack=1 ;PHP 5.3之前做的优化 ;opcache.dups_fix=0 ; 仅作为针对“不可重定义类”错误的一种解决方案。;opcache.blacklist_filename="" ; 黑名单文件为文本文件,包含了不进行预编译优化的文件名 ;opcache.max_file_size=0 ; 以字节为单位的缓存的文件大小上限 ;opcache.consistency_checks=0 ; 如果是非 0 值,OPcache 将会每隔 N 次请求检查缓存校验和 opcache.force_restart_timeout=180 ; 如果缓存处于非激活状态,等待多少秒之后计划重启。;opcache.error_log="" ;OPcache 模块的错误日志文件 ;opcache.log_verbosity_level=1 ;OPcache 模块的日志级别。致命(0)错误(1) 警告(2)信息(3)调试(4);opcache.preferred_memory_model="" ;OPcache 首选的内存模块。可选值包括:mmap,shm, posix 以及 win32。;opcache.protect_memory=0 ; 保护共享内存,以避免执行脚本时发生非预期的写入。仅用于内部调试。;opcache.mmap_base=null ; 在 Windows 平台上共享内存段的基地址

六、FAQ

问题一

可能遇到的问题
centos7 编译 libiconv ./stdio.h:1010:1: 错误:‘gets’未声明(不在函数内)
make 报错:./stdio.h:1010:1: 错误:‘gets’未声明(不在函数内)
make[2]: *** [progname.o] 错误 1
make[2]: 正在离开目录 `/home/lmos/libiconv-1.14/srclib'make[1]: *** [all] 错误 2make[1]: 正在离开目录 `/home/lmos/libiconv-1.14/srclib'
make: *** [all] 错误 2
cd srclib  目录
sed -i -e '/gets is a security/d' ./stdio.in.h

问题二

checking size of off_t... 0
configure: error: off_t undefined; check your library configuration

# 添加搜索路径到配置文件
echo '/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64'>>/etc/ld.so.conf
# 更新配置
ldconfig -v

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-09发表,共计9602字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中