编译安装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`

  

原文地址:https://www.cnblogs.com/-beyond/p/9343401.html