说一下起因,有台aliyun服务器,上一年刚用的时候使用lnmp一键安装包,选择安装了apache(2.4)、mysql(5.6)、php(5.6)。
最近想升级php版本,因为旧版php(5.6)我还要继续用,直接升级的话肯定有些代码不兼容(例如composer下载来使用的类库)想多版本Php可以一起使用,我装的是lamp,问题来了,只有lnmp可以多版本,所以发生下面的事情
所以目前情况是我要在apache配置多版本。上网努力地搜了一下,基本都是在nginx或者iis上配置多版本php,不符合我的需求。其实也找到一些在apache上配置多版本php的文章,按我的理解和操作没有一篇能完成的,可能是我理解能力差或者技术菜吧。我是集合了多篇文章里的要点和折磨了一天慢慢理解出来,最后才完成apache上配置多版本php。技术上只是一个小学生,如果有错误的地方麻烦指出来,感激不尽。
1、下载php7.3
因为下载很慢,使用kxsw瞬间搞掂
我是直接在 php官网 下载然后扔到服务器上的。
当然也可以使用命令
cd /
wget https://www.php.net/distributions/php-7.3.20.tar.gz
2、解压
tar -xzvf php-7.3.20.tar.gz
3、配置一些编译前的参数
cd php-7.3.20
./configure '--prefix=/usr/local/php7.3' '--with-config-file-path=/usr/local/php7.3/etc' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-gd' '--with-iconv' '--with-zlib' '--enable-xml' '--enable-bcmath' '--enable-shmop' '--enable-sysvsem' '--enable-inline-optimization' '--enable-mbregex' '--enable-fpm' '--enable-mbstring' '--enable-ftp' '--enable-gd-native-ttf' '--with-openssl' '--enable-pcntl' '--enable-sockets' '--with-xmlrpc' '--enable-zip' '--enable-soap' '--with-pear' '--with-gettext' '--enable-session' '--with-mcrypt' '--with-curl' '--with-libzip=/usr/local/libzip-1.3.2' '--disable-fileinfo'
**--prefix=/usr/local/php7.3,等号后面的是你接下来安装的路径,按需填写。
--enable-fpm这个参数需要留意一下。是按照php-fpm方式安装。
对应的参数是--with-apxs2=/usr/local/apache/bin/apxs,等号前是使用模块的方式安装,等号后面是填写对应apache的路径。--enable-fpm和--with-apxs2=PATH模式,两者只能取其一,参数填写了--enable-fpm就不要--with-apxs2,后者直接安装在了apache中,会随着apache的启动而启动。**
**提前说一下后面编译里出现了两个问题:
3.1、提示libzip版本太低,如果有这种问题出现,具体可以上网查。无非就是重新下载安装。重点就是要在上面内容里加上对应的参数,例如我的是libzip版本低就加上 --with-libzip=/usr/local/libzip-1.3.2
3.2、提示内存不足。我机器是2G。所以提前加上 --disable-fileinfo**
4、编译和安装
make && make install
一般等个10来20分钟就完成了。视机器配置而定。
5、下载与编译安装mod_fcgid
安装Apache的mod_fcgid模块 mod_fcgid模块可以实现Apache下多版本php同时运行。可以自行上网找
我是会用的是2.3.9版本 压缩包格式是gz
cd /
tar -zxvf mod_fcgid-2.3.9.tar.gz
cd mod\_fcgid-2.3.9
APXS=/usr/local/apache/bin/apxs ./configure.apxs
make
make install
安装好之后找到apache里的httpd.conf(lamp默认是/usr/local/apache/conf)文件
大概150行左右,就是LoadModule加载模块最后一行,添加
LoadModule fcgid_module modules/mod_fcgid.so
其实上面编译安装后就会自动添加了,不用动手操作,在此记录下来。
6、多域名多版本php配置(就是在这里卡了一下)
网上很多资料和文章都是在apache的httpd.conf添加类似以下的代码
,然后重启apache。重启后直接死掉,php无法解析
#加载fcgid扩展模块(额外说明,fcgid根据实际apache版本对应,apache2版本测试2.3.6正常)
LoadModule fcgid\_module modules/mod\_fcgid.so
#添加映射
AddHandler fcgid-script .fcgi .php
# 设置PHP\_FCGI\_MAX\_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程在处理完所有请求前退出
FcgidInitialEnv PHP\_FCGI\_MAX\_REQUESTS 1000
#php-cgi每个进程的最大请求数
FcgidMaxRequestsPerProcess 1000 #php-cgi最大的进程数
FcgidMaxProcesses 3
#最大执行时间
FcgidIOTimeout 120
FcgidIdleTimeout 120
#限制最大请求字节 (单位b)
FcgidMaxRequestLen 2097152
AddType application/x-httpd-php .php
#------这里是默认虚拟主机配置
#php.ini的存放目录
FcgidInitialEnv PHPRC "D:/php5.4.4/"
#php-cgi的路径
FcgidWrapper "D:/php5.4.4/php-cgi.exe" .php
后来想到这里的配置是所有域名都调用的,换个法子。去到需要升级成7.3php版本的域名下(lamp默认是/usr/local/apache/conf/vhost)填写红框内的内容。
为了方便复制
#映射fcgi执行脚本
AddHandler fcgid-script .fcgi .php
#设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程 在处理完所有请求前退出
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
#php-cgi每个进程的最大请求数
FcgidMaxRequestsPerProcess 520
#最大执行时间
FcgidIOTimeout 300
#最大空闲时间
FcgidIdleTimeout 300
#限制最大请求字节
FcgidMaxRequestLen 2097152
#php程序最大文件上传限制50MB,默认只有2MB
MaxRequestLen 52428800
#php安装路径
FcgidInitialEnv PHPRC "/usr/local/php7.3/"
#php-cgi脚本执行路径
FcgidWrapper "/usr/local/php7.3/bin/php-cgi" .php
#这里要注意是填写在<Directory></Directory>里
Options FollowSymlinks ExecCGI
最后Options里的FollowSymlinks ExecCGI记得添加。不填写ExecCGI,php运行不了。FollowSymlinks不填写,一些项目里的直接进不去,就是打开连接报错,说目录没有权限访问。
最后重启apache就搞定了。可以在脚本输入phpinfo();打开连接访问就行了。
可以看到链接的.cn和.com是不同域名但访问的是同一份文件。
有参考过的文章:
https://my.oschina.net/u/2366984/blog/809833
https://www.cnblogs.com/sky-view/p/5112888.html
https://my.oschina.net/u/2366984/blog/543148
https://blog.51cto.com/12529218/2313761
https://www.osyunwei.com/archives/10174.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。