文章目录
下载php5.6.40
- 进入 /usr/local/src 目录
cd /usr/local/src
- 到官网下载php5.6.40的源码压缩包
https://www.php.net/distributions/php-5.6.40.tar.gz
sudo wget https://www.php.net/distributions/php-5.6.40.tar.gz
- 解压并进入源码目录
sudo tar -xzvf php-5.6.40.tar.gz
cd php-5.6.40
一、安装依赖
sudo apt install unzip \
gcc g++ \
openssl \
libssl-dev \
iptables \
libpcre3-dev \
libpam0g-dev \
libxslt1-dev \
libxml2-dev \
perl at gperf \
curl libcurl4 libcurl4-openssl-dev \
libzip-dev \
libbz2-dev \
libgd-dev \
libmcrypt-dev libtidy-dev \
libgeoip-dev \
libatomic-ops-dev \
zlib1g-dev \
libstdc++-5-dev \
libsnmp-dev \
snmp-mibs-downloader \
libgmp-dev \
autoconf
编译过程中可能会出现openssl版本不兼容的问题
首先查看openssl版本
openssl version
如果openssl版本大于 1.0.2,那就需要下载1.0.2版本的openssl编译安装,因为 php5.6 不兼容1.1.1版本的openssl。
下载openssl1.0.2源码:https://www.openssl.org/source/openssl-1.0.2k.tar.gz
cd /usr/local/src
sudo wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
sudo tar -xzvf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k
sudo ./config
sudo make & make install
openssl会安装在 /usr/local/ssl
二、设置编译配置项
cd /usr/local/src/php-5.6.40
sudo ./configure --prefix=/usr/local/php5.6 \
--with-openssl=/usr/local/ssl \
--with-gd \
--with-fpm-user=nobody \
--with-fpm-group=nobody \
--with-mysqli \
--with-pdo-mysql \
--with-curl \
--with-tidy \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--with-pear \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-gettext \
--with-mhash \
--with-pcre-regex \
--with-kerberos \
--with-iconv \
--with-snmp \
--with-gmp \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-mbstring \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-sysvmsg \
--enable-sysvshm \
--enable-wddx \
--enable-xml \
--enable-zip \
--enable-inline-optimization \
--enable-session \
--enable-shared \
--enable-pcntl \
--enable-mbregex \
--enable-gd-jis-conv \
--enable-fpm \
--enable-opcache \
--enable-dba
其他参数(可选):
–with-libdir 其实./configure 默认在 /usr/lib 查找各种库,这个参数可以指定在哪里查找各种库,比如:
--with-libdir=/usr/lib64 在 /usr/lib64 查找各种需要的库
可能会出现的问题
- Please reinstall the libcurl distribution - easy.h should be in /include/curl
将 /usr/include/x86_64-linux-gnu/curl 建立一个软链接放在 /usr/include
sudo ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
- Unable to locate gmp.h
将 /usr/include/x86_64-linux-gnu/gmp.h 创建软链接放在 /usr/include
sudo ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
-
not found libXpm.(a|so)
加上这个参数 --with-xpm-dir 就会出现找不到 libXmp 的问题,就算安装了 libXmp 也会出现,手动指定 libXmp 的路径也无法解决 -
编译阶段,出现 openssl 的问题,基本是openssl的版本太高了,需要安装 1.0.2版本 的openssl,然后重新 ./configure ,用 --with-openssl 参数指定 openssl的位置
--with-openssl=/usr/local/ssl
三、编译安装
编译
sudo make
安装
sudo make install
四、启动php-fpm
安装成功之后,就到了配置php-fpm的阶段了。
先进入php目录
cd /usr/local/php5.6
移动 php.ini 配置文件
首先看看php默认读取的php.ini是在哪个位置
./bin/php --ini
输出有:
Configuration File (php.ini) Path => /usr/local/php5.6/lib
说明 php 会自动读取放在 /usr/local/php5.6/lib 的 php.ini 配置文件,那我们下面就把 php.ini 放在 /usr/local/php5.6/lib 里面。
在php的源码目录里面有一个 php.ini-development 文件,将这个文件复制到我们现在所在目录的 lib 文件夹下,命名为 php.ini
sudo cp /usr/local/src/php-5.6.40/php.ini-development ./lib/php.ini
然后就可以通过修改 php.ini 来开启各种需要的扩展,修改各种配置了。
在还没修改 php.ini 之前执行 ./bin/php -m
可以查看 php 当前有什么模块,这些模块都是随着 php 一起编译进去的,不用在 php.ini 开启。
配置 php-fpm
查看当前路径的 etc 目录,有一个 php-fpm.conf.default 文件,这个文件是 php-fpm 配置的例子,里面有各个参数的说明。
现在我们在这个 etc 目录创建一个 php-fpm.conf 文件,将一些简单参数写进入:
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
include=etc/fpm.d/*.conf
参数说明:
pid = run/php-fpm.pid // 在php-fpm启动后,会将pid写在 /usr/local/php5.6/var/run/php-fpm.pid 这个文件
error_log = log/php-fpm.log // php-fpm的错误日志
include=etc/fpm.d/*.conf // 引入其他配置文件
既然要引入其他的配置文件,那么就要创建配置文件才行,在当前目录的 etc 里创建 fpm.d 目录,再在里面创建 test.conf
cd /usr/local/php5.6
sudo mkdir ./etc/fpm.d
sudo touch ./etc/fpm.d/test.conf
在 test.conf 写入下面的内容
[test]
listen = 127.0.0.1:9000
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 5
;记录日志
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /usr/local/php5.6/logs/cartechpro9000-fpm-err.log
php_flag[display_errors] = off
php_admin_value[memory_limit] = 256M
pm.max_requests = 3000
request_terminate_timeout = 300
里面有两个参数 ,name 和 group,这两个参数的作用是指定系统用哪个用户去运行 php-fpm的工作进程,默认是不允许用 root 用户去运行功能进程的,因为 root 的权限太大,万一某个php脚本要删除系统文件,成功执行就出事了。所以要想用 root 执行工作进程,需要另外配置。
php-fpm 启动后,启动的是主进程,主进程再根据配置,创建n个工作进程,用 name和group 指定的用户去运行。
主进程监听到请求,就把请求分配给某个工作进程去处理,处理完再返回。
在上面的配置中,name和group配置的是名为 php-fpm 的用户,所以要先查查系统是否有 php-fpm 这个用户存在,不存在则需要创建
id -u php-fpm
如果用户存在,则会返回用户的id,不存在就会提示 “id: ‘php-fpm’: no such user”
如果 php-fpm 用户不存在,则创建: sudo useradd php-fpm
启动 php-fpm
到这里,php-fpm 已经配置好了,可以启动了
sudo ./sbin/php-fpm
用 ps 命令查看一下
ps -aux | grep php
关闭 php-fpm
方法一:按进程名称关闭
sudo pkill php-fpm
这种方法可以关闭所有 php-fpm 进程,如果系统里跑着 php5.6 和 php7.4,这种方法会把 php7.4 的 php-fpm 也关掉。
方法二:按进程 pid 关闭
上面提到的配置文件 php-fpm.conf ,里面有个配置项
pid = run/php-fpm.pid
如果有配置这个配置项,那么,可以在 /usr/local/php5.6/var/run/ 下面找到 php-fpm.pid 这个文件,这个文件里面就写着当前这个 php-fpm 主进程的 pid,接下来我们就可以用这个 pid 来关闭 php-fpm 了。
sudo kill -INT `cat /usr/local/php5.6/var/run/php-fpm.pid`
注意了,上面包裹着
cat /usr/local/php5.6/var/run/php-fpm.pid
的不是单引号,而是反引号,在键盘ESC
键的下面。
如果有多个版本的 php-fpm 在运行,这种方法就可以只关闭某个版本的 php-fpm
重启 php-fpm
方法一:kill掉进程重新启动
sudo kill -INT `cat /usr/local/php5.6/var/run/php-fpm.pid`
sudo /usr/local/php5.6/sbin/php-fpm
方法二:用 kill -USR2
sudo sudo kill -USR2 `cat /usr/local/php5.6/var/run/php-fpm.pid`
五、pecl安装扩展
安装扩展使用 pecl ,这个东西在 /usr/local/php5.6/bin
获取证书
首先,pecl 安装扩展,是在 http://pecl.php.net/ 查找资源的,下载资源需要用https,所以要先配置好证书。
下载最新的证书:
cd /usr/local/src
sudo wget http://curl.haxx.se/ca/cacert.pem
查看 php 默认读取的证书位置
php -r "print_r(openssl_get_cert_locations());"
我的输出是这样的:
Array
(
[default_cert_file] => /usr/local/ssl/cert.pem
[default_cert_file_env] => SSL_CERT_FILE
[default_cert_dir] => /usr/local/ssl/certs
[default_cert_dir_env] => SSL_CERT_DIR
[default_private_dir] => /usr/local/ssl/private
[default_default_cert_area] => /usr/local/ssl
[ini_cafile] =>
[ini_capath] =>
)
第一个参数 [default_cert_file] 就是证书位置。
接下来将下载到的证书移动到对应的位置
sudo mv cacert.pem /usr/local/ssl/cert.pem
配置pecl
配置 pecl 的 php_ini 路径
cd /usr/local/php5.6/bin
sudo ./pear config-set php_ini /usr/local/php5.6/lib/php.ini
例子:安装redis扩展
查询 redis 扩展
sudo ./pecl search redis
我查到的是 5.3.3 版本的 redis 扩展
安装 redis 扩展
sudo ./pecl install redis
会提示 php 版本太低,5.3.3 版本的redis扩展,要求php最低版本是7.0,所以安装失败了。
要想安装指定版本的扩展,需要在 http://pecl.php.net/ 自己找需要的扩展和合适的版本,比如 redis 扩展,php5.6 最高可用的版本是 2.2.8,在下图圈住的地方,点鼠标右键->复制链接地址,然后执行下面这句安装:
sudo ./pecl install <刚刚复制到的链接地址>
例如:
sudo ./pecl install http://pecl.php.net/get/redis-2.2.8.tgz
或者更简易的写法
sudo ./pecl install redis-2.2.8
pecl 安装扩展是下载扩展的源码,然后编译安装,所以系统需要安装有 autoconf,如果没有,则会在安装扩展时编译出错
直接用 apt 就可以安装 autoconf :sudo apt install autoconf
如果有正确配置pecl的php_ini这个配置项,那么安装完后,pecl 会自动在 php.ini 加上这个扩展的配置 : extension=redis.so
,如果没有自动加上这个扩展配置,那就手动在php.ini加上。