【转载】阿里云Lnmp环境PHP7与PHP5共存方案
一、安装PHP7背景【参照:https://blog.51cto.com/happyliu/1954337】
1、当前版本:
PHP 5.5.7
2、安装原因:
为了体验PHP7的速度和性能,加上对新技术的热衷。但是直接切换是不明智的,可能会存在代码不兼容等等问题,因此准备编译安装PHP7,Nginx根据PHP-FastCGI监听端口启用哪个PHP版本。
二、什么是FastCGI
1)FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。大多数流行的HTTP server都支持FastCGI,包括Apache,Nginx和lighttpd等当然PHP也在其中之列了。
2)FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将其得到的结果返回给浏览器。
三、PHP版本共存思路
1)Nginx是通过PHP-FastCGI与PHP进行交互的。而PHP-FastCGI运行后会通过文件、或本地端口两种方式进行监听,在Nginx中配置相应的FastCGI监听端口或文件即实现Nginx请求对PHP的解释。
2)既然PHP-FastCGI是监听端口和文件的,那就可以让不同版本的PHP-FastCGI同时运行,监听不同的端口或文件,Nginx中根据需求配置调用不同的PHP-FastCGI端口或文件,即可实现不同版本PHP共存了。
四、安装过程
1、PHP7的安装:
1)PHP7的下载:
下载地址:https://github.com/php/php-src/releases
我选择的是php7.3.3,地址为:https://github.com/php/php-src/archive/php-7.3.3.tar.gz
wget https://github.com/php/php-src/archive/php-7.3.3.tar.gz
tar -xvf php-7.3.3.tar.gz
cd php-7.3.3
2)安装依赖:初次安装PHP的话,需要安装依赖,如果之前安装过的话,就不用了,当然,重新安装一下也没啥坏处
yum install 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
3)设置编译路径:【内存小于1G的,请将红色部分变成–disable-fileinfo】
./configure \
–prefix=/alidata/server/php7 \
–exec-prefix=/alidata/server/php7 \
–bindir=/alidata/server/php7/bin \
–sbindir=/alidata/server/php7/sbin \
–includedir=/alidata/server/php7/include \
–libdir=/alidata/server/php7/lib/php \
–mandir=/alidata/server/php7/php/man \
–with-config-file-path=/alidata/server/php7/etc \
–with-mysql-sock=/tmp/mysql.sock \
–with-mhash \
–with-openssl \
–with-mysqli=shared,mysqlnd \
–with-pdo-mysql=shared,mysqlnd \
–with-freetype-dir \
–with-gd \
–with-iconv \
–with-zlib \
–enable-zip \
–enable-inline-optimization \
–enable-sockets \
–enable-soap \
–enable-session \
–with-curl \
–enable-opcache \
–enable-fpm \
–enable-mbstring \
–enable-opcache \
–enable-ftp \
–enable-mbregex \
–with-fpm-user=www \
–with-fpm-group=www \
–enable-fileinfo
4)开始编译安装:
make && make install
安装结果为:
5)配置文件:安装好后,来设置PHP7的配置文件:php.ini、php-fpm.conf和php-fpm启动脚本
cp ./php.ini-production /alidata/server/php7/etc/php.ini
cp ./sapi/fpm/php-fpm.conf /alidata/server/php7/etc/php-fpm.conf
cp /alidata/server/php7/etc/php-fpm.d/www.conf.default /alidata/server/php7/etc/php-fpm.d/www.conf
cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm
chmod 755 /etc/init.d/php7-fpm
6)修改端口号:
上面的命令执行后,来修改一下/alidata/server/php7/etc/php-fpm.d目录下的www.conf里的 listen = 127.0.0.1:9000为listen = 127.0.0.1:9001,大约在36行左右。如果有老版本的php-fpm使用了9000端口,那么PHP7的fpm端口要修改成9001,具体你自己定
7)把php7-fpm加入开机启动
chkconfig –add php7-fpm
chkconfig php7-fpm on
8)其他命令:启动php7-fpm
service php7-fpm start
service php7-fpm stop
service php7-fpm restart
service php7-fpm reload
start,启动PHP的FastCGI进程
stop,强制终止PHP的FastCGI进程
quit,平滑终止PHP的FastCGI进程
restart, 重启PHP的FastCGI进程
reload, 重新加载PHP的php.ini
logrotate, 重新启用log文件
PHP7-fpm重动完成后,来配置一个nginx【修改/alidata/server/nginx/conf/vhosts里面的配置文件】可以使用PHP7
fastcgi_pass 127.0.0.1:9001;
2、PHP7安装redis
phpredis在php7、php5下都有不同的版本,装岔了可能会编译报错,所以在安装之前请先看下自己的PHP是啥版本。
用phpinfo()查看安装的php信息。
版本信息:
确认是php7后开始安装。
下载地址: wget https://github.com/phpredis/phpredis/releases (现已支持PHP7)
我装的是4.2.0 https://github.com/phpredis/phpredis/archive/4.2.0.tar.gz
然后进入文件的目录,开始重新编译phpize:
wget https://github.com/phpredis/phpredis/releases
cd phpredis
phpize #/alidata/server/php7/bin/phpize这个命令不怎么管用,总是报autoconf版本问题,但是我已经安装最新的了,所以,只能使用phpize了
./configure –with-php-config=/alidata/server/php7/bin/php-config
make && make install
最后在/usr/local/php7/etc/php.ini 里面加入:extension=redis.so php.ini文件也是藏匿在lib、etc、bin这仨之一,装的时候多找找
重启HTTP应用程序如:nginx
这时候再次打开phpinfo()页面,搜索redis看能不能找到
大功告成
3、PHP7安装mcrypt
附加说明:如果是php7.2以上 mcrypt扩展默认被移除,需要自动安装
如果以上方法不行,参考下面步骤处理
从 mcrypt库地址 下载适用版本,然后解压
wget http://pecl.php.net/get/mcrypt-1.0.1.tgz
tar zxvf mcrypt-1.1.1.tgz
cd mcrypt-xxx
phpize
./configure –with-php-config=/alidata/server/php7/bin/php-config
make && make install
最后配置php.ini
最后配置php的扩展配置,添加extension=mcrypt.so就可以了
【备注】安装过程中遇到的问题:
1)报错1:unrecognized options报错
有些参数已经去除了,不再需要添加该参数,默认开启,这些参数我就从上面的去掉了。例如:–with-mysql、–enable-fastcgi、–with-mcrypt等,不然会报错以下错误:configure: WARNING: unrecognized options: –enable-fastcgi
2)报错2: make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1
编译时当配置PHP时出现,可能会出现 make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1 时,那是因为服务器内存不足1G,如过内存大于1G的话,可以忽略这个,先试试看。只需要在配置命令中添加 –disable-fileinfo即可【我这边暂时变成了–enable-fileinfo】。
3)报错3:libzip报错问题,Please reinstall the libzip distribution,
主要是版本号的问题,解决方案为:【参照:https://unixso.com/Php/libzip.html】
先删除libzip:yum remove libzip -y
下载安装、编译libzip
wget https://nih.at/libzip/libzip-1.2.0.tar.gz #libzip 1.4及以上版本安装需要cmake,此处选择1.2
tar -zxvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure
make
make install
4)报错4:/usr/local/include/zip.h:59:21: 错误:zipconf.h:没有那个文件或目录
如果编译过程中,出现如下报错:
/usr/local/include/zip.h:59:21: 错误:zipconf.h:没有那个文件或目录
In file included from /root/zip-1.14.0/php7/php_zip.h:31
添加libzip的软连接,即可解决。
ln -s /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h
5)报错5:make: *** [Zend/zend_execute.lo] Error 1:还是虚拟内存不足,两种方案:
(1)把mysqld进行先毙掉吧【这个暂用的内存还是比较大的】;
(2)或者创建一个虚拟内存:解决方法:手动分配一个swap空间【参照:https://www.jianshu.com/p/2d8898e25f1b】
dd if=/dev/zero of=/swap bs=1024 count=1M #创建一个大小为1G的文件/swap
mkswap /swap #将/swap作为swap空间
swapon /swap #enable /swap file for paging and swapping
echo “/swap swap swap sw 0 0” >> /etc/fstab #Enable swap on boot, 开机后自动生效
6)报错6:make: *** [sapi/cli/php] Error 1:解决方法有两种【参照:https://www.cnblogs.com/chunguang/p/5580247.html】
方法1: vi Makefile
在安裝 PHP 到系统中时要是发生「undefined reference to libiconv_open’」之类的错误信息,那表示在「./configure 」沒抓好一些环境变数值。错误发生点在建立「-o sapi/cli/php」是出错,没給到要 link 的 iconv 函式库参数。 解决方法:编辑Makefile 大约110 行左右的地方: EXTRA_LIBS = ….. -lcrypt 在最后加上 -liconv,例如: EXTRA_LIBS = ….. -lcrypt -liconv 然后重新再次 make 即可。
方法2:
make ZEND_EXTRA_LIBS=’-liconv’
ln -s /usr/local/lib/libiconv.so.2 /usr/lib64/
make ZEND_EXTRA_LIBS=’-liconv’ 这个命令主要是因为机器没有安装libiconv之类的库,怕编译出错,所以不为php加入iconv模块,让PHP正常编译,最后建立一个软链接
重点来了,为了将上述的编译流程简化,特意规整了一个脚本【install_httpd_php-7.3.3.sh】,没试过,你们自己可以试试!
#!/bin/bash
wget https://github.com/php/php-src/archive/php-7.3.3.tar.gz
tar zxvf php-7.3.3.tar.gz
cd php-7.3.3
./configure –prefix=/alidata/server/php7 \
–exec-prefix=/alidata/server/php7 \
–bindir=/alidata/server/php7/bin \
–sbindir=/alidata/server/php7/sbin \
–includedir=/alidata/server/php7/include \
–libdir=/alidata/server/php7/lib/php \
–mandir=/alidata/server/php7/php/man \
–with-config-file-path=/alidata/server/php7/etc \
–with-mysql-sock=/tmp/mysql.sock \
–with-mhash \
–with-openssl \
–with-mysqli=shared,mysqlnd \
–with-pdo-mysql=shared,mysqlnd \
–with-freetype-dir \
–with-gd \
–with-iconv \
–with-zlib \
–enable-zip \
–enable-inline-optimization \
–enable-sockets \
–enable-soap \
–enable-session \
–with-curl \
–enable-opcache \
–enable-fpm \
–enable-mbstring \
–enable-opcache \
–enable-ftp \
–enable-mbregex \
–with-fpm-user=www \
–with-fpm-group=www \
–enable-fileinfo
#判断CPU是否大于1核所进行的处理
CPU_NUM=$(cat /proc/cpuinfo | grep processor | wc -l)
if [ $CPU_NUM -gt 1 ];then
make ZEND_EXTRA_LIBS=’-liconv’ -j$CPU_NUM
else
make ZEND_EXTRA_LIBS=’-liconv’
fi
make install#配置文件
cp ./php.ini-production /alidata/server/php7/etc/php.ini
cp ./sapi/fpm/php-fpm.conf /alidata/server/php7/etc/php-fpm.conf
cp /alidata/server/php7/etc/php-fpm.d/www.conf.default /alidata/server/php7/etc/php-fpm.d/www.conf
cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm
chmod 755 /etc/init.d/php7-fpm#将php7-fpm设置成开机启动
chkconfig –add php7-fpm
chkconfig php7-fpm on
#adjust php.ini 设置对应的参数
sed -i ‘s#; extension_dir = \”\.\/\”#extension_dir = “/alidata/server/php7/lib/php/extensions/no-debug-non-zts-20121212/”#’ /alidata/server/php7/etc/php.ini
sed -i ‘s/post_max_size = 8M/post_max_size = 64M/g’ /alidata/server/php7/etc/php.ini
sed -i ‘s/upload_max_filesize = 2M/upload_max_filesize = 64M/g’ /alidata/server/php7/etc/php.ini
sed -i ‘s/;date.timezone =/date.timezone = PRC/g’ /alidata/server/php7/etc/php.ini
sed -i ‘s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=1/g’ /alidata/server/php7/etc/php.ini
sed -i ‘s/max_execution_time = 30/max_execution_time = 300/g’ /alidata/server/php7/etc/php.ini
service php7-fpm restart
sleep 5
其他可利用资源:
1)Docker容器引擎:http://www.runoob.com/docker/docker-resources.html
2)PECL扩展库:http://php.net/manual/zh/install.pecl.intro.php