去发现生活中的美好,记录生活中的点点滴滴

多php版本共同运行方案

php admin 381℃

随着php7.0发布,php的性能有了质的飞跃,据官网给出的结论,php7.0的性能将是php5.6的两倍!但是php7虽然好用,可不是所有项目都支持的,很多微信的插件、接口都不兼容php7,还有很多老的系统还保留了大量的不兼容php7的方法,实际改起来费时费力,这个时候,有没有一种解决方案,能两全其美呢?答案是肯定的,那就是php多版本共存,即老的系统还是用原来的版本,新的项目想尝试php7性能带来的快感,这些版本共同运行即可。

假设之前已经安装有了php5.6,在/usr/local/php目录,则现在只需安装php7即可:

进入到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

注意:配置的文件目录,要新增一个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

QQ截图20171215145441

可以看到,两个版本的进程都已启动;

接下来又到了关键时刻,配置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,这个软件可以支持运行多版本,具体就不赘述了,百度有资料。

·

转载请注明:永盟博客 » 多php版本共同运行方案

喜欢 (1)