编译安装php
环境:Ubuntu 18.04 LTS
本文的所有软件包都已经全部上传到github上了,地址如下:
https://github.com/searchingbeyond/install-php-by-compile
编译安装libxml2
tar -zxf libxml2-2.7.2.tar.gz cd libxml2-2.7.2/ ./configure --prefix=/usr/local/libxml2 make -j 3 make install
编译安装zlib
tar -zxf zlib-1.2.11.tar.gz cd zlib-1.2.11/ ./configure --prefix=/usr/local/zlib make -j 2 make install
编译安装bzip2
tar -zxf bzip2-1.0.6.tar.gz cd bzip2-1.0.6/ make make install PREFIX=/usr/local/bzip
编译安装openssl
openssl的下载地址:http://distfiles.macports.org/openssl/
操作命令如下:
tar zxf openssl-1.0.2r.tar.gz cd openssl-1.0.2r ./config --prefix=/usr/local/openssl make && make install
编译安装curl
tar -zxf curl-7.64.1.tar.gz curl-7.64.1/ cd curl-7.64.1/ ./configure --prefix=/usr/local/curl make -j 3 make install
安装libpng
因为安装GD库需要libpng,所以需要安装它。
对于libpng,推荐使用命令安装,Ubuntu使用下面的命令安装:
apt install libpng-dev
而CentOS可以使用下面的命令安装:
yum install libpng yum install libpng-devel
编译安装PHP
首先下载php二进制包,地址如下:http://php.net/releases/
选择自己要下载的php版本,然后解压之后,编译安装即可。
wget https://www.php.net/distributions/php-7.1.20.tar.gz
解压下载的源码:
tar -zxf php-7.1.20.tar.gz cd php-7.1.20
这里在安装的时候开启了很多模块,可以根据自己的需求增减:
./configure \ --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-gd \ --with-gettext \ --with-kerberos \ --with-mysqli \ --with-pcre-regex \ --with-pdo-mysql \ --with-pear \ --with-xmlrpc \ --with-openssl-dir=/usr/local/openssl \ --with-zlib-dir=/usr/local/zlib \ --with-libxml-dir=/usr/local/libxml2 \ --with-curl=/usr/local/curl \ --with-bz2=/usr/local/bzip \ --with-mhash \ --enable-fpm \ --enable-bcmath \ --enable-inline-optimization \ --enable-mbregex \ --enable-mbstring \ --enable-opcache \ --enable-pcntl \ --enable-shmop \ --enable-soap \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-xml \ --enable-zip
如果在执行过程中出错,可以参考:https://www.cnblogs.com/-beyond/p/9813717.html
编译并安装
make -j 3 make install
到这个时候,php就已经安装成功了,但是在命令行中输入php后,提示并没有安装php,那是因为没有添加php的路径。
php.ini
注意,通常php.ini是保存在php安装路径下的lib目录下,但是通过源码编译的方式安装的时候,并不会生成配置文件,而配置文件是在源码中。
ls /usr/local/src/php-7.1.20/php.ini* php.ini-development php.ini-production
将源码中的配置文件拷贝到php的安装路径下的etc目录下
cp /usr/local/src/php-7.1.20/php.ini-development /usr/local/php/etc/php.ini
添加php二进制文件的路径
打印你的PATH环境变量,
-> # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
想在命令直接输入php,而不是输入/usr/local/php/bin/php运行php,有两种方法:
方法1:直接将php的路径添加到PATH中即可
-> # export PATH=$PATH:/usr/local/php/bin -> # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/usr/local/php/bin
注意Linux中,全局变量的作用范围,以及持久性,如果要持久有效,可以保存到/etc/profile,$HOME/.bash_profile,或者另外几个配置文件中。
方法2:创建链接(一般创建软连接)
软链接可以保存在PATH中的bin或者sbin目录中,一般自己安装的软件软链接是保存在/usr/local/sbin中。
-> # ln -s /usr/local/php/bin/php /usr/local/sbin/php
测试
创建一个php文件:
<?php phpinfo(); ?>
然后使用php命令执行该文件,打印php信息:
-> # php index.php
启动php-fpm
php-fpm在之前使用--enable-fpm参数时,就已经将php-fpm安装了,但是,php-fpm并不是想php一样启动。
php-fpm可执行程序的路径是在php安装目录下的sbin/php-fpm。比如上面我的php安装路径是/usr/local/php,那么php-fpm的路径就是/usr/local/php/sbin/php-fpm。
php-fpm默认监听的端口是9000。
php-fpm的配置文件适合php的配置文件在一起,在/usr/local/php/etc/php-fpm.conf,但是默认的php-fpm的配置文件是php-fpm.conf.default,所以需要将文件名修改为php-fpm.conf,否则会出现如下错误:
-> # /usr/local/php/sbin/php-fpm [05-Aug-2018 17:19:27] ERROR: failed to open configuration file '/usr/local/php/etc/php-fpm.conf': No such file or directory (2) [05-Aug-2018 17:19:27] ERROR: failed to load configuration file '/usr/local/php/etc/php-fpm.conf' [05-Aug-2018 17:19:27] ERROR: FPM initialization failed
接着,进行如下操作:
-> # #创建名称为www的user和group。 -> # groupadd www -> # useradd -g www www -> # -> # cd /usr/local/php -> # cp etc/php-fpm.conf.default etc/php-fpm.conf -> # cp etc/php-fpm.d/www.conf.default etc/php-fpm.d/www.conf -> # -> # #修改php-fpm的配置文件内容,取消pid = run/php-fpm.pid这一行的注释,让其有效 -> # vi etc/php-fpm.conf -> # -> # #将/usr/local/php/etc/php-fpm.d/www.conf中user和group修改为www。 -> # vi etc/php-fpm.d/www.conf
尝试启动php-fpm
-> # /usr/local/php/sbin/php-fpm -> # -> # #查看php-fpm的状态 -> # ps -ef | grep php-fpm root 12200 1 0 23:00 ? 00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) 1002 12201 12200 0 23:00 ? 00:00:00 php-fpm: pool www 1002 12202 12200 0 23:00 ? 00:00:00 php-fpm: pool www root 13365 1221 0 23:22 pts/0 00:00:00 grep --color=auto php-fpm -> # -> # #查看php-fpm占用的端口 -> # lsof -i:9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 13499 root 7u IPv4 148862 0t0 TCP VM_0_8_centos:cslistener (LISTEN) php-fpm 13500 www 5u IPv4 148862 0t0 TCP VM_0_8_centos:cslistener (LISTEN) php-fpm 13501 www 5u IPv4 148862 0t0 TCP VM_0_8_centos:cslistener (LISTEN)
从上面的php-fpm进程可以看出,php-fpm的运行模式是master-worker模式,
1、FPM 的 master 进程接收到请求
2、master 进程根据配置指派特定的 worker 进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合 Nginx 遇到502错误比较多的原因。
3、worker 进程处理请求,如果超时,返回504错误
4、请求处理结束,返回结果
关闭php-fpm的方式
#平滑关闭php-fpm kill -QUIT `cat /usr/local/php/var/run/php-fpm.pid` #强制立即关闭php-fpm kill -TERM `cat /usr/local/php/var/run/php-fpm.pid`