有时候我们需要在不同的项目文件夹下使用不同版本的php,虽然可以通过变更apache配置文件httpd.conf来切换,但每次都需要重启apache服务才能生效,非常不方便。
安装fcgid模块
这时需要apache安装一个mod fcgid
模块。
下载地址:
https://www.apachehaus.com/cgi-bin/download.plx
下载后将mod_fcgid.so
文件拷贝至apache的modules目录,然后在httpd.conf文件末尾添加:
LoadModule fcgid_module modules/mod_fcgid.so
重启apache
使用htaccess
在文件夹下放置一个.htaccess
文件,在里面规定该文件夹下使用的php版本:
AddHandler fcgid-script .php
Options +ExecCGI
FCGIWrapper E:/www/server/php8/php-cgi.exe .php
注意
apache使用fastcgi模式来运行php后,可能会导致非index.php页面出现No input file specified
的错误。这是由于有的php框架是基于PATH_INFO
来执行路由的,使用fastcgi模式后,$_SERVER
中没有了PATH_INFO
,故导致这个错误。
解决办法:
将伪静态.htaccess文件中的:
RewriteRule ^(.*)$ index.php/$1 [L]
修改为:
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
然后打印$_SERVER
会发现多了REDIRECT_PATH_INFO
,然后修改php程序,使用REDIRECT_PATH_INFO
来替代之前的PATH_INFO
完整的包含伪静态+PHP版本的.htaccess
文件内容:
AddHandler fcgid-script .php
Options +ExecCGI
FCGIWrapper E:/www/server/php8/php-cgi.exe .php
<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>