【转载】 Apache使用fcgid模块配置多个PHP版本共存(无需 php7apache24.dll)

转载

  1. https://blog.csdn.net/zhouzme/article/details/53995566
  2. https://www.cnblogs.com/fps2tao/p/9401224.html

原因

尝试使用 qt 实现 phpstudy

注意

配置完成后还是报错 403,需要修改 httpd.conf 中 Options 追加 ExecCGI

DocumentRoot "${SRVROOT}/htdocs"
<Directory "${SRVROOT}/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks ExecCGI

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

正文

因为涉及多个时期开发的项目维护,每个项目使用的PHP版本都不同,想要在本地开发并调试就非常麻烦了,必须得想办法同时使用多个PHP版本才行

于是总结了下面方法做个记录,apache 用的不多,只是本地开发测试环境用apache感觉简单方便点儿。
如果用 Nginx 来配置多个PHP版本的话应该会更简单了吧,修改下PHP的listen端口就好了。

一、根据 apache 版本下载对应的 mod_fcgid-版本-win64-VC14.zip

下载地址: https://www.apachelounge.com/download/
我当前的版本是 mod_fcgid-2.3.10-win64-VS16 ,将压缩包内 \mod_fcgid-2.3.10-win64-VS16\mod_fcgid-2.3.10\mod_fcgid.so 的这个文件移动到 \apache\modules\mod_fcgid.so

二、修改 httpd.conf 末尾 添加

注意了,这里的 FcgidMaxRequestLen 很重要也很坑爹。

当你上传文件的时候发现总是出现500错误,而程序其实没有错误。
实际上是因为上传内容体积过大,即便修改了php.ini 中配置的上传参数也没有用的,必须修改这里才行,nginx下也会有类似的问题

LoadModule fcgid_module modules/mod_fcgid.so
AddHandler fcgid-script .fcgi .php
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
FcgidMaxRequestsPerProcess 1000
FcgidMaxProcesses 15
FcgidIOTimeout  120
FcgidIdleTimeout  120
AddType application/x-httpd-php .php
# 全局默认使用的PHP版本配置
FcgidInitialEnv PHPRC "C:/ProgramFiles(x86)/php5.6"
FcgidWrapper "C:/ProgramFiles(x86)/php5.6/php-cgi.exe" .php
# 上传文件的最大尺寸 100MB
FcgidMaxRequestLen 104857600

三、对需要不同 PHP 版本的设置 httpd-vhosts.conf 添加下面代码(第三步是针对不同网站设置,不需要可以忽略)

    FcgidInitialEnv PHPRC "C:/ProgramFiles(x86)/php7.0"
    FcgidWrapper "C:/ProgramFiles(x86)/php7.0/php-cgi.exe" .php

注意:FcgidWrapper 中的路径使不能存在 空格 的,否则无法启动 Apache 了
因为历史原因我的软件都给装在了这个Program Files (x86)文件夹下面,又懒得换路径,为了兼容,我这里创建了文件夹的符号链接
命令格式:mklink /d "新生成的符号链接文件夹名称和绝对路径" "源文件夹绝对路径"
image

修改 httpd-vhosts.conf 配置后的样子:

同样的,如果你还需要其他版本则直接下载对应版本的PHP后解压,然后指向那个目录就行了

<VirtualHost *:80>
    DocumentRoot "E:\Website\domain.com\www"
    ServerName www.domain.com
    ServerAlias *.domain.com
    FcgidInitialEnv PHPRC "C:/ProgramFiles(x86)/php7.0"
    FcgidWrapper "C:/ProgramFiles(x86)/php7.0/php-cgi.exe" .php
</VirtualHost>

测试

我测试了三个版本,php5.6(全局默认使用的版本), php7.0,php7.1
httpd-vhosts.conf 配置如下:

Listen 81
Listen 82
Listen 83

<VirtualHost *:81>
    DocumentRoot "E:\Website\local81"
    ServerName 127.0.0.1
</VirtualHost>
<VirtualHost *:82>
    DocumentRoot "E:\Website\local82"
    ServerName 127.0.0.1
    FcgidInitialEnv PHPRC "C:/ProgramFiles(x86)/php7.0"
    FcgidWrapper "C:/ProgramFiles(x86)/php7.0/php-cgi.exe" .php
</VirtualHost>
<VirtualHost *:83>
    DocumentRoot "E:\Website\local83"
    ServerName 127.0.0.1
    FcgidInitialEnv PHPRC "C:/ProgramFiles(x86)/php7.1"
    FcgidWrapper "C:/ProgramFiles(x86)/php7.1/php-cgi.exe" .php
</VirtualHost>
posted @   夏秋初  阅读(336)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2019-09-23 【转载|不建议使用】Laravel 生成二维码的方法
点击右上角即可分享
微信分享提示