随着php7.0发布,php的性能有了质的飞跃,据官网给出的结论,php7.0的性能将是php5.6的两倍!但是php7虽然好用,可不是所有项目都支持的,很多微信的插件、接口都不兼容php7,还有很多老的系统还保留了大量的不兼容php7的方法,实际改起来费时费力,这个时候,有没有一种解决方案,能两全其美呢?答案是肯定的,那就是php多版本共存,即老的系统还是用原来的版本,新的项目想尝试php7性能带来的快感,这些版本共同运行即可。
假设之前已经安装有了php5.6,在/usr/local/php目录,则现在只需安装php7即可:
首先,安装依赖:
yum -y install zlib-devel libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel libzip-devel pcre-devel readline-devel
进入到src目录,下载php7最新版本:
cd /usr/local/src
这里使用的是最新版本的php7.2
wget http://cn2.php.net/distributions/php-7.2.0.tar.gz
解压:
tar -xzvf php-7.2.0.tar.gz
进入到版本目录:
cd php-7.2.0/
编译安装:
CFLAGS= CXXFLAGS= ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc \
--with-fpm-user=www --with-fpm-group=www --enable-fpm --enable-opcache \
--disable-fileinfo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-jpeg-dir \
--with-iconv-dir=/usr/local --with-freetype-dir --with-png-dir --with-zlib --disable-rpath \
--with-libxml-dir=/usr --enable-xml --enable-bcmath --enable-shmop --enable-exif --with-curl \
--enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-inline-optimization \
--enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl \
--with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-ftp \
--with-gettext --enable-zip --enable-soap --disable-ipv6 --disable-debug
常规编译:
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-mysqlnd-compression-support --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-intl --with-mcrypt --with-libmbfl --enable-ftp --with-gd --enable-gd-jis-conv --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext --disable-fileinfo --enable-opcache --with-pear --enable-maintainer-zts --with-ldap=shared --without-gdbm
注意:配置的文件目录,要新增一个php7目录,不能和原来的php5.6同一个目录,否则会覆盖之前的版本。
在编译php的时候,config可能没有问题,但在make的时候可能出现undefined reference to `libiconv_open’之类的错误,也许是因为机器没有安装libiconv之类的库,怕编译出错,所以不为php加入liconv模块吧
make ZEND_EXTRA_LIBS='-liconv'
执行安装:
make install
安装完成后,配置一些基本信息:
php_install_dir=/usr/local/php7
cp php.ini-production $php_install_dir/etc/php.ini
Mem=`free -m | awk '/Mem:/{print $2}'`
if [ $Mem -gt 1024 -a $Mem -le 1500 ];then
Memory_limit=192
elif [ $Mem -gt 1500 -a $Mem -le 3500 ];then
Memory_limit=256
elif [ $Mem -gt 3500 -a $Mem -le 4500 ];then
Memory_limit=320
elif [ $Mem -gt 4500 ];then
Memory_limit=448
else
Memory_limit=128
fi
sed -i "s@^memory_limit.*@memory_limit = ${Memory_limit}M@" $php_install_dir/etc/php.ini
sed -i 's@^output_buffering =@output_buffering = On\noutput_buffering =@' $php_install_dir/etc/php.ini
sed -i 's@^;cgi.fix_pathinfo.*@cgi.fix_pathinfo=0@' $php_install_dir/etc/php.ini
sed -i 's@^short_open_tag = Off@short_open_tag = On@' $php_install_dir/etc/php.ini
sed -i 's@^expose_php = On@expose_php = Off@' $php_install_dir/etc/php.ini
sed -i 's@^request_order.*@request_order = "CGP"@' $php_install_dir/etc/php.ini
sed -i 's@^;date.timezone.*@date.timezone = Asia/Shanghai@' $php_install_dir/etc/php.ini
sed -i 's@^post_max_size.*@post_max_size = 50M@' $php_install_dir/etc/php.ini
sed -i 's@^upload_max_filesize.*@upload_max_filesize = 50M@' $php_install_dir/etc/php.ini
sed -i 's@^;upload_tmp_dir.*@upload_tmp_dir = /tmp@' $php_install_dir/etc/php.ini
sed -i 's@^max_execution_time.*@max_execution_time = 600@' $php_install_dir/etc/php.ini
sed -i 's@^;realpath_cache_size.*@realpath_cache_size = 2M@' $php_install_dir/etc/php.ini
sed -i 's@^disable_functions.*@disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen@' $php_install_dir/etc/php.ini
sed -i 's@^session.cookie_httponly.*@session.cookie_httponly = 1@' $php_install_dir/etc/php.ini
sed -i 's@^mysqlnd.collect_memory_statistics.*@mysqlnd.collect_memory_statistics = On@' $php_install_dir/etc/php.ini
[ -e /usr/sbin/sendmail ] && sed -i 's@^;sendmail_path.*@sendmail_path = /usr/sbin/sendmail -t -i@' $php_install_dir/etc/php.ini
#如果编译时去掉了 --enable-opcache,则以下包含opcache的都请忽略
sed -i 's@^\[opcache\]@[opcache]\nzend_extension=opcache.so@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.enable=.*@opcache.enable=1@' $php_install_dir/etc/php.ini
sed -i "s@^;opcache.memory_consumption.*@opcache.memory_consumption=$Memory_limit@" $php_install_dir/etc/php.ini
sed -i 's@^;opcache.interned_strings_buffer.*@opcache.interned_strings_buffer=8@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.max_accelerated_files.*@opcache.max_accelerated_files=4000@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.revalidate_freq.*@opcache.revalidate_freq=60@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.save_comments.*@opcache.save_comments=0@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.fast_shutdown.*@opcache.fast_shutdown=1@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.validate_timestamps.*@opcache.validate_timestamps=1@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.enable_cli.*@opcache.enable_cli=1@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.use_cwd.*@opcache.use_cwd=1@' $php_install_dir/etc/php.ini
sed -i 's@^opcache.max_accelerated_files.*@opcache.max_accelerated_files=100000@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.max_wasted_percentage.*@opcache.max_wasted_percentage=5@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.consistency_checks.*@opcache.consistency_checks=0@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.optimization_level.*@;opcache.optimization_level=0@' $php_install_dir/etc/php.ini
之后,直接沿用php5.6的配置:
cp -f /usr/local/php/etc/php-fpm.conf /usr/local/php7/etc/
当然,还不能马上用,需要修改php-fpm.conf一些配置:
#修改listen 端口号
vim php-fpm.conf
关键来了,php5.6版本使用的是9000,而php7.2版本使用的端口是9001
listen = 127.0.0.1:9001
重启php5和php7(比较粗暴,可以尝试service php-fpm启动方式,这里不做扩展):
killall php-fpm
分别启动:
/usr/local/php/sbin/php-fpm &
/usr/local/php7/sbin/php-fpm &
查看进程
ps aux|grep php-fpm
可以看到,两个版本的进程都已启动;
加入开机启动:
echo "nohup /usr/sbin/php-fpm -R 2>&1 &"
其他配置加载(可选)
/usr/bin/php-fpm -c /etc/php.ini -y /usr/local/etc/php-fpm.conf
接下来又到了关键时刻,配置nginx信息:
vim /usr/local/nginx/conf/vhost/test.conf
如果该项目使用的是php5.6版本,则fastcgi_pass使用的端口是9000
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
如果该项目使用的是php7.2版本,则fastcgi_pass使用的端口是9001
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
至此,完成了双版本同时共存运行方案。
如果使用的不是linux系统,而是window系统,则可以使用软件PHPWAMP,这个软件可以支持运行多版本,具体就不赘述了,百度有资料。
·