如果环境中只有一个PHP版本,那直接配置Apache或者Nginx配置就行了。本文说的是如果是多个PHP版本,如何在Apache中配置一个指定PHP7版本的项目。
1.首先,需要Apache的mod_fcgid模块来支持运行多个PHP版本。
mod_fcgid的下载就是通过正常的下载tar包安装就可以了。这里有个坑就是APXS的问题:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz #下载 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
就是上面那个配置apxs的步骤。至于apxs是什么,可以点这里详细了解一下。
坑就坑在,我这个机器上是通过rpm安装的httpd,根本就没有apxs这个工具。当然按理说通过rpm安装一下就OK了,但是,当我用命令
yum -y install httpd-devel |
去安装的时候报错了。提示我httpd-devel和我安装的httpd版本不一致。。。
然后我用yum list httpd* 查看了一下,果然这个yum源下的httpd-devel工具和httpd不是一个版本。
已经安装的httpd是2.2.15-69。而我的yum源下是httpd-devel-2.2.15-59。这就坑了啊。然后我机会找遍了网上的其他yum源,也没找到httpd-devel-2.2.15-69版本。(当然这里如果是源码安装的方式是可以在configure的时候指定apxs)
然后就找啊找,终于在rpm的官方网站上找到了这个版本的rpm包。
RPM Search httpd-devel (pbone.net)
安装好apxs之后,就可以接着往下走,配置Apache
<VirtualHost *:88> ServerAdmin webmaster@dummy-host.example.com DocumentRoot /var/new_rsync ServerName 10.240.180.172 ErrorLog logs/dummy-host.example.com-error_log CustomLog logs/dummy-host.example.com-access_log common DirectoryIndex index.htm index.html index.php AddHandler fcgid-script .fcgi .php FcgidInitialEnv PHPRC "/usr/local/webserver/php-7.2.24" #php安装路径 FcgidWrapper "/usr/local/webserver/php-7.2.24/bin/php-cgi" .php #php-cgi脚本执行路径 SocketPath /etc/httpd/logs/fcgidsock <Directory "/var/new_rsync"> php_admin_value open_basedir "/var/new_rsync:/tmp/" Options Includes ExecCGI FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
然后再修改.htaccess文件,修改重写规则
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] </IfModule>
至此,Apache下运行多版本PHP就完成了,打开浏览器能正常访问,以为万事大吉了。其实后面还有坑~
虽然,新的站点是在Apache下运行起来了,但是后面去运行yaf的时候又出幺蛾子了。
出现了下面的报错
PHP Fatal error: Class ‘/Yaf//Application’ not found
查了下发现是命名空间的问题,在本地的环境是开启命名空间的,所以yaf的继承核心类都是命名空间的方式。结果在Linux环境上一直提示找不到,查看php.ini上yaf的yaf.use_namespace已经是打开的状态。然后打印PHPinfo发现yaf.use_namespace的local value是开启,但是master value是空。然后看Apache的配置里也没有修改这个值的设置,然后怎么修改php.ini并且重启php-fpm和php-cgi都不好使,master value一直是空。最后没办法,直接是修改了yaf里的命名方式,换成了没有命名空间的方式。最终才可以正常访问了。
直接访问yaf默认路由是没问题的,但是访问自定义模块还是会报错,找不到对应的文件,说明还是解析yaf路由出现了问题。然后打印$_SERVER发现没有PATH_INFO这个属性,然后通过修改Apache的重写规则来解决,而且是必须写到项目根目录的.htaccess文件中,写到conf文件中不生效。就是这个规则 RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
至此,整个yaf+PHP7的环境才跑通~