博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CentOS 7.2编译安装PHP7
阅读量:7088 次
发布时间:2019-06-28

本文共 10416 字,大约阅读时间需要 34 分钟。

原文:
PHP官方:
Github源:
 
1 创建php用户和用户组,并在github下载php7源码
#######新建php用户和php组[root@typecodes ~]# groupadd -r www && useradd -r -g www -s /bin/false -d /usr/local/php7 -M php#####安装编译php7时需要的依赖包[root@typecodes ~]# yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
2 PHP7编译参数的配置

准备工作做好后,就开始正式配置php7的安装明细了。注意,操作时一定要先把下面反斜杠“\”后面添加的注释文字去掉!!!

cd /usr/local/src && wget http://cn2.php.net/get/php-7.3.0.tar.bz2/from/this/mirror -O php-7.3.0.tar.bz2 && tar -xjvf php-7.3.0.tar.bz2 && cd php-7.3.0 ######开始配置[root@typecodes php-7.3.0]# ./configure \--prefix=/usr/local/php7 \--exec-prefix=/usr/local/php7 \--bindir=/usr/local/php7/bin \--sbindir=/usr/local/php7/sbin \--includedir=/usr/local/php7/include \--libdir=/usr/local/php7/lib/php \--mandir=/usr/local/php7/php/man \--with-config-file-path=/usr/local/php7/etc \--with-mysql-sock=/var/lib/mysql/mysql.sock \--with-mcrypt=/usr/include \--with-mhash \--with-openssl \--with-mysql=shared,mysqlnd \--with-mysqli=shared,mysqlnd \--with-pdo-mysql=shared,mysqlnd \--with-gd \--with-iconv \--with-zlib \--enable-zip \--enable-inline-optimization \--disable-debug \--disable-rpath \--enable-shared \--enable-xml \--enable-bcmath \--enable-shmop \--enable-sysvsem \--enable-mbregex \--enable-mbstring \--enable-ftp \--enable-gd-native-ttf \--enable-pcntl \--enable-sockets \--with-xmlrpc \--enable-soap \--without-pear \--with-gettext \--enable-session \--with-curl \--with-jpeg-dir \--with-freetype-dir \--enable-opcache \--enable-redis \--enable-fpm \--enable-fastcgi \--with-fpm-user=www \--with-fpm-group=www \--without-gdbm \--disable-fileinfo

 执行上面的配置命令的结果:

configure: WARNING: unrecognized options: --with-mysql, --enable-fastcgi

 

3 开始编译和安装PHP7
[root@typecodes php-7.3.0]# make && make install

部分编译出错的环境请使用

#make ZEND_EXTRA_LIBS='-liconv';

#make install

编译安装完成PHP7!

 

5 查看编译成功后的PHP7安装目录

由于需要和MySQL进行通信,所以需要特别查看PHP7安装后的lib扩展库目录(/usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718/),需要确保至少存在mysqli.sopdo_mysql.so这两个动态库文件。

 

6 开始设置PHP7的配置文件php.ini、php-fpm.conf、www.conf和php-fpm脚本

可以用编译后的配置文件复制到PHP7的配置目录(/usr/local/php7/etc/),推荐使用文中整理的3个PHP7配置文件和php-fpm服务控制脚本。

find /usr -name *php.ini*

#######直接使用编译后未经优化处理的配置 cp /usr/local/src/php-7.3.0/php.ini-production /usr/local/php7/etc/php.ini cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf cp /usr/local/src/php-7.3.0/sapi/fpm/php-fpm.service /lib/systemd/system/php-fpm.service
cd /usr/local/src && wget https://github.com/phpredis/phpredis/archive/4.1.1.tar.gz && tar zxvf 4.1.1.tar.gz
#用phpize生成configure配置文件 cd phpredis-4.1.1 && /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
 
cd /usr/local/src && wget https://github.com/swoole/swoole-src/archive/v4.2.7.tar.gz && tar zxvf v4.2.7.tar.gz
#用phpize生成configure配置文件 cd swoole-src-4.2.7 && /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
 
cd /usr/local/src && wget http://pecl.php.net/get/mcrypt-1.0.1.tgz && tar zxvf mcrypt-1.0.1.tgz
#用phpize生成configure配置文件 cd mcrypt-1.0.1 && /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install #######去掉文件中的注释、空行 vi /usr/local/php7/etc/php.ini vi /usr/local/php7/etc/php-fpm.conf vi /usr/local/php7/etc/php-fpm.d/www.conf :g/^;/d :g/^$/d
1. 配置php-fpm.conf

php-fpm.conf是php-fpm进程服务的配置文件:

######Pid file的默认前缀是/usr/local/php7/var pid = run/php-fpm.pid error_log = /var/log/php-fpm/error.log include=/usr/local/php7/etc/php-fpm.d/*.conf
2. 配置www.conf(在php-fpm.d目录下)

www.conf这是php-fpm进程服务的扩展配置文件:

######设置用户和用户组 user = www group = www ######根据nginx.conf中的配置fastcgi_pass unix:/dev/shm/php-fpm.sock;设置PHP监听 ; listen = 127.0.0.1:9000 #####不建议使用 listen = /dev/shm/php-fpm.sock listen.owner = www listen.group = www listen.mode = 0777 listen.allowed_clients = /dev/shm/php-fpm.sock ######使用静态进程数max_children=内存/512 pm = static pm.max_children = 200 pm.max_requests = 0 pm.status_path = /fpmStatus ######开启慢日志 slowlog = /var/log/php-fpm/$pool-slow.log request_slowlog_timeout = 30s request_terminate_timeout = 0
3. 配置php.ini

php.ini是php运行核心配置文件:

######避免PHP信息暴露在http头中expose_php = Off######常用配置 error_reporting = E_ALL & ~E_NOTICE display_errors = Off log_errors = On html_errors = Off error_log = /var/log/php/php-error.log ignore_repeated_errors = On ignore_repeated_source = On memory_limit = 1024M max_execution_time = 300 max_input_time = 300 post_max_size = 128M max_input_vars = 1000000 file_uploads = On upload_tmp_dir = /tmp/www upload_max_filesize = 100M session.gc_maxlifetime = 14400 default_socket_timeout = 600
######设置PHP的扩展extension_dir = "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718" extension=mcrypt.so extension=mysqli.so extension=pdo_mysql.so extension=opcache.so extension=redis.so extension=swoole.so######设置PHP的时区date.timezone = PRC######开启opcache[opcache]opcache.enable=1 opcache.enable_cli=1 opcache.huge_code_pages=1 opcache.file_cache=/tmp
######设置PHP脚本允许访问的目录(需要根据实际情况配置);open_basedir = /usr/share/nginx/html; session.save_handler = redis session.save_path = "tcp://*****.aliyuncs.com:6379?auth=******" [MySQLi] mysqli.reconnect = On
4 在配置文件中使用到的路径或文件,配置权限
mkdir -p /var/log/php/ mkdir -p /var/log/php-fpm/ mkdir -p /run/php-fpm/ mkdir -p /var/lib/php/session touch /dev/shm/php-fpm.sock chown www.www /dev/shm/php-fpm.sock chmod 777 /dev/shm/php-fpm.sock chown -R www:www /var/lib/php ######配置PHP连接MySQL的端口监听文件 mkdir -p /var/lib/mysql/ touch /var/lib/mysql/mysql.sock touch /usr/local/php7/var/run/php-fpm.pid chmod 777 /var/lib/mysql/mysql.sock ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
5 测试php-fpm配置,设置开机自启动
######测试配置 /usr/local/php7/sbin/php-fpm -t ######修改文件权限 chmod 745 /lib/systemd/system/php-fpm.service ######设置为开机启动 systemctl enable php-fpm.service ######启动php-fpm systemctl start php-fpm.service

 

 

通过命令ps -aux|grep php查看是否成功(图中的php-fpm进程数和进程用户www都是由www.conf中pm.start_servers和user的值分别决定的):

查看php服务进程

11 查看PHP7版本信息

最后,可以通过命令php -v查看当前PHP版本信息,图中可以看到当前PHP7还使用了Zend OPcache缓存,是因为在php.ini文件中添加了zend_extension=opcache.so配置。

查看PHP7版本信息

 

systemctl restart php-fpm systemctl restart nginx kill -USR2 `cat /usr/local/php7/var/run/php-fpm.pid` /usr/local/nginx/sbin/nginx -s reload ==============================================================
分配512个预留的大页内存,优化PHP-opcache:sysctl vm.nr_hugepages=512 查看CPU核数:cat /proc/cpuinfo| grep "cpu cores"| uniq

 

vi /etc/profile  底部加入

export PATH=$PATH:/usr/local/php7/bin

 

特别优化:

1、修改/usr/local/nginx/conf/nginx.conf 文件  http中

client_max_body_size 100m;
client_body_buffer_size 2048k;

 

=============================================================================================================

对于进程的管理存在两种风格——static和dynamic。

如果设置成static,php-fpm进程数自始至终都是pm.max_children指定的数量,不再增加或减少。

如果设置成dynamic,则php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers。

这两种不同的进程管理方式,可以根据服务器的实际需求来进行调整。

这里先说一下涉及到这个的几个参数,他们分别是pmpm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers

pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。

下面4个参数的意思分别为:

pm.max_children:static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量。 

pm.max_requests:php-fpm子进程能处理的最大请求数。 
pm.start_servers:动态方式下的起始php-fpm进程数量。 
pm.min_spare_servers:动态方式下服务器空闲时最小php-fpm进程数量。 
pm.max_spare_servers:动态方式下服务器空闲时最大php-fpm进程数量。

如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程(专用服务器推荐使用)。

如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。

对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

那么对于一般的服务器,怎么设置这些值呢,也是有值可参考的。

一般一个php-cgi进程占用20~30m左右的内存,php-fpm稍多一点,就按30m算吧。你的物理mem大小/30m差不多就是可以设置的php-fpm进程数了,当然实际肯定要比这个少点。比如我8G的内存,大概设置100~200之间,也就是pm.max_children=100 是一个比较合适的值。

这里面还有一个问题,php-fpm因为一些第三方库可能会引起内存泄漏,时间长了,占用的内存会比较多,像我们的服务器现在就是50m左右,还好,有pm.max_requests这个参数,这个参数指定了一个php-fpm子进程执行多少次之后重启该进程。这个可能就要根据你的实际情况调整了

php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭,这样会导致此时nginx发给php的请求无法得到相应,会出现短时间的502.解决方法:

增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值

单php-fpm占用内存 = 内存占用总量 / php-fpm进程数

查看内存使用量: free -m

 

static :表示在 `php-fpm` 运行时直接 `fork` 出 `pm.max_chindren` 个子进程,dynamic:表示,运行时 `fork` 出 `start_servers` 个进程,随着负载的情况,动态的调整,最多不超过 `max_children` 个进程。

 

一般推荐用 static

  • 优点是不用动态的判断负载情况,提升性能;

  • 缺点是多占用些系统内存资源。

 PHP-FPM 子进程数量,是不是越多越好?

 当然不是,pm.max_chindren,进程多了,增加进程管理的开销以及上下文切换的开销。

 更核心的是,能并发执行的 php-fpm 进程不会超过 cpu 个数。

 如何设置,取决于你的代码

  • 如果代码是 CPU 计算密集型的,pm.max_chindren 不能超过 CPU 的内核数。

  • 如果不是,那么将 pm.max_chindren 的值大于 CPU 的内核数,是非常明智的。

 国外技术大拿给出这么个公式:

 在 N + 20%M / m 之间。

N 是 CPU 内核数量。

M 是 PHP 能利用的内存数量。
m 是每个 PHP 进程平均使用的内存数量。

 适用于 dynamic 方式。

 static方式:M / (m * 1.2)

 当然,还有一种保险的方式,来配置 max_children。适用于 static 方式。

  • 先把 max_childnren 设置成一个比较大的值。
  • 稳定运行一段时间后,观察 php-fpmstatus 里的 max active processes 是多少
  • 然后把 max_children 配置比它大一些就可以了。

 pm.max_requests:指的是每个子进程在处理了多少个请求数量之后就重启。

 这个参数,理论上可以随便设置,但是为了预防内存泄漏的风险,还是设置一个合理的数比较好。

=============================================================================================================

 

 

php-fpm管理,master进程可以理解以下信号:

INT,TERM 立刻终止
QUIT 平滑终止
USR1 重新打开日志文件
USR2 平滑重载所有worker进程并重新载入配置和二进制模块
示例:
php-fpm 关闭:
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
php-fpm 重启:
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
查看php-fpm进程数:
ps aux | grep -c php-fpm

 

php-fpm status详解

pool – fpm池子名称,大多数为www

process manager – 进程管理方式,值:static, dynamic or ondemand. dynamic
start time – 启动日期,如果reload了php-fpm,时间会更新
start since – 运行时长
accepted conn – 当前池子接受的请求数
listen queue – 请求等待队列,如果这个值不为0,那么要增加FPM的进程数量
max listen queue – 请求等待队列最高的数量
listen queue len – socket等待队列长度
idle processes – 空闲进程数量
active processes – 活跃进程数量
total processes – 总进程数量
max active processes – 最大的活跃进程数量(FPM启动开始算)
max children reached - 大道进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。
slow requests – 启用了php-fpm slow-log,缓慢请求的数量

 

转载地址:http://wjfql.baihongyu.com/

你可能感兴趣的文章
13 SELECT 以外的内容
查看>>
初中面谈招生网上招生报名系统
查看>>
.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
查看>>
干货:史上最实用逃顶绝招十二式!
查看>>
鸟哥Linux私房菜 基础学习篇读书笔记(10):Linux磁盘和文件系统管理(3)
查看>>
简述Session 、Cookie、cache 区别
查看>>
large-scale analysis of malware downloaders
查看>>
pyqt声音输入
查看>>
FMX 模态窗体
查看>>
使用storyboard实现页面跳转,简单的数据传递
查看>>
有些事明显对自己有益,为什么却无法去做?
查看>>
IOS开发基础知识--碎片30
查看>>
C语言编程规范—命名规则
查看>>
批处理-剪切文件夹到指定目录
查看>>
java POi excel 写入大批量数据
查看>>
关于子类对象的构造函数和父类构造函数的执行顺序
查看>>
.NET Core Web 应用部署到 Docker 中运行
查看>>
Saltstack-API(十二)
查看>>
Asp.net Boilerplate源码中NotNullAttribute的用处
查看>>
javascript继承
查看>>