Windows下的php-fpm?

41

PHP-FPM的主页http://php-fpm.org/指出,它是自PHP 5.3.3以来的一部分。现在,我想知道,当我从php.net下载最新的PHP二进制文件时,其中没有php-fpm。我该如何获取它?它是否适用于Windows操作系统?

7个回答

27

以下是如何在Windows上设置php-fpm:

  1. http://windows.php.net/download/下载.zip文件。.zip文件应该是VC9版本,其中包含FastCGI文件(php-cgi.exe)。不要下载VC6版本,也不要下载.msi文件,因为安装php-fpm需要已经设置好IIS。zip文件包含了php-cgi.exe,这是你需要的php-fpm文件。我下载了一个稍旧的版本,php-5.3.10-Win32-VC9-x86.zip,从这里http://windows.php.net/downloads/releases/archives/,因为我想与我的生产服务器上运行的版本相匹配。

  2. 解压文件,例如解压到C:\php-5.3.10-Win32-VC9-x86

  3. 根据需要编辑php.ini文件。我的操作如下:

# nginx security setting
cgi.fix_pathinfo=0

extension_dir = "C:\php-5.3.10-Win32-VC9-x86\ext"

取消以下模块的注释以启用它们:

extension=php_curl.dll
extension=php_mbstring.dll
extension=php_mysqli.dll
  • 在某个地方创建一个 .bat 文件,例如在 webserver 目录或 PHP 目录中创建 start-php-fcgi.bat:

  • @ECHO OFF
    ECHO Starting PHP FastCGI...
    set PATH=C:\php-5.3.10-Win32-VC9-x86;%PATH%
    C:\php-5.3.10-Win32-VC9-x86\php-cgi.exe -b 127.0.0.1:9123 -c C:\php-5.3.10-Win32-VC9-x86\php.ini
    
  • 双击 .bat 文件启动 php-fpm。一个窗口将弹出并保持打开状态,直到它停止运行。这有点烦人,但我还没有研究过如何设置为服务。

  • 配置您的 Web 服务器。如果您想在 nginx 中使用它,则以下是针对 127.0.0.1:9123 的配置示例:

  • location ~ \.php$ {
        fastcgi_pass    127.0.0.1:9123;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
    

    52
    但那不是php-fpm,而是fastcgi。 - Jürgen Paul
    19
    PHP-FPM 是 PHP FastCGI 进程管理器。 - Alan
    8
    指南很有用,虽然塞弗勒斯是对的。在这种情况下,进程管理器是启动和关闭单个fastcgi进程的批处理文件。实际的php-fpm要更加灵活,并带有一个300行的配置文件。 - sayap
    4
    @Alan 是的,但这个答案只是一个处理开始器。它没有多线程或其他支持并发请求的功能。 - Sleavely
    2
    php-cgi.exe 是一个 FastCGI 服务器,而不是 FastCGI 进程管理器。它只是生成 FCGI 进程。 - Sebi2020
    显示剩余3条评论

    18

    虽然这篇文章很旧,但我还想发表一下观点,因为这里发布的不是关于PHP-FPM的内容,而是使用Fast-CGI运行PHP的内容。

    是的,PHP-FPM代表PHP-FastCGI进程管理器,因此实现了FastCGI,但您忘记了FPM远远不止于此,因为它包含了Web服务器无法管理的进程管理功能。

    在*nix系统上,PHP-FPM有一个单独的进程来管理PHP子进程,并具有详细的配置以指定如何管理这些进程。有关这些功能的详细信息,请参阅这里

    在Windows上启动CGI进程并不相同。它不会产生工作进程,也不会动态缩放它们或允许多线程。

    尚未有适用于Windows的PHP-FPM。 http://php.net/manual/en/install.fpm.php#121725

    但是,如果您愿意,可以像建议的那样启动CGI进程。


    14

    艾伦的回答是一个很好的开端。然而,对于Apache 2.4及更高版本,您不需要将PHP-FPM作为单独的服务运行,您可以使用mod_fcgid在Apache内部处理所有内容。

    这里是一个示例配置:

    LoadModule fcgid_module modules/mod_fcgid.so
    
    FcgidInitialEnv PHPRC "c:/php"
    FcgidInitialEnv PATH "c:/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
    FcgidInitialEnv SystemRoot "C:/Windows"
    FcgidInitialEnv SystemDrive "C:"
    FcgidInitialEnv TEMP "C:/WINDOWS/Temp"
    FcgidInitialEnv TMP "C:/WINDOWS/Temp"
    FcgidInitialEnv windir "C:/WINDOWS"
    FcgidIOTimeout 64
    FcgidConnectTimeout 16
    FcgidMaxRequestsPerProcess 500
    
    <Files ~ "\.php$">
      AddHandler fcgid-script .php
      FcgidWrapper c:/php/php-cgi.exe .php
    </Files> 
    

    请注意,这是基于Apache Lounge上的帖子。虽然它很有帮助,但他们的版本在c:/php/php-cgi.exe周围加了引号,如果你这样做,它将无法启动php-cgi.exe,至少在Windows Server 2012上,你会得到HTTP 500错误。花了我痛苦的几天才找出来。


    亲爱的Erica,非常感谢您为我解决了这个问题!我已经苦苦挣扎了几周(虽然是间歇性的)。 - Theodore R. Smith
    5
    这不是对问题的回答。问题是关于 fpm 在 Windows 上的使用情况。你提供了一种替代使用 fpm 的方法。请重新回答问题。 - Kissaki
    1
    一种适用于许多Windows用户的方法,以及一个已经帮助了其他人的答案...说真的,你需要给这个点踩吗? - Erica Kane
    1
    我在运行Apache 2.4.16时,没有遇到关于php-cgi.exe引号的任何问题。就像参考帖子中所述,我怀疑这个问题影响了旧版本的Apache。当然,我使用的是Server 2008,而不是Server 2012。 - Jake Z
    1
    这是一个有效的回答。如果你的引擎停止了,你认为它需要一个新的通量电容器,那么有人说“这些对你的型号不可用,但这个线圈包会让她继续运转”也是一个有效的回答。 - JSON
    显示剩余5条评论

    3
    自 PHP v5.3.3 起,FPM Server-API [SAPI] 支持已整合到核心 PHP 中。这意味着,您可以使用 FPM-SAPI [使用 --enable-fpm 配置参数] 支持编译和构建 PHP 的源代码,而不是像 Apache SAPI [--enable-apx2] 一样。如在 PHP-Wiki 中所示,您可以以几乎与 *nix 系统相同的方式构建 PHP - 即配置方面。我建议您先学习在 *nix 系统中构建 PHP 的细节,甚至尝试自己构建[通常为configuremakemake install模式],然后尝试利用从中获得的经验来构建 Windows 环境。

    除了 --enable-fpm 配置参数外,还有两个额外的参数:--with-fpm-user=USERNAME_HERE--with-fpm-group=USERGROUPNAME_HERE。这两个参数适用于 *nix 环境,但可能在 Windows 上不可用。

    总的来说,我相信您可以在 Windows 上使用 Visual Studio IDE 构建自己的 PHP-FPM 服务器应用程序。截至本文撰写日期,没有官方的 PHP-FPM 构建。

    编辑 1:好吧,我可能错了,因为这个 SAPI 使用 *nix 环境中的 libevent 组件。看来您最终还是得坚持使用Cygwin-bundled 安装


    根据此页面的评论,显然libevent已在5.3.4中被移除。 - 93196.93

    2

    目前PHP-FPM仅适用于Linux系统。有些网站提供了在Windows系统下使用cygwin运行php-fpm的教程,您可以尝试按照这些指南操作。


    6
    目前在Windows上安装PHP-FPM相当容易。即使在2011年,您的答案明显是不正确的:(1)如果它能在Cygwin下工作,它就可以在Windows和Linux之外的系统上工作;(2)它可以在Solaris、FreeBSD、NetBSD、Mac OS X、OpenBSD等系统上工作。 - Dereckson

    2
    在Windows上,当您使用IIS运行PHP并安装“PHP FastCGI”模块时,您将获得与PHP-FPM所解释的类似功能。换句话说,这不是官方的PHP-FPM代码库,而只是类似的功能。
    首先,IIS会生成多个php-cgi.exe进程(工作进程)。任何PHP请求都将被传递给一个工作进程,IIS将根据服务器资源动态生成更多的工作进程。这些设置可以在IIS上的服务器树节点下的“Fast CGI”选项中进行配置。
    话虽如此,我认为性能方面php-cgi.exe不能与Apache服务器相媲美。
    您可以在此处查看有关IIS 7的安装过程:https://learn.microsoft.com/en-us/iis/application-frameworks/install-and-configure-php-applications-on-iis/using-fastcgi-to-host-php-applications-on-iis FastCGI通过提供一种机制,使得一个进程可以重复使用多次来处理许多请求,从而解决了CGI固有的性能问题。此外,FastCGI通过提供可重用进程池并确保每个进程一次只处理一个请求,保持与非线程安全库的兼容性。

    0

    PHP-FPM主要使用*NIX特定功能,不太可能被移植到Windows系统。实际上,这也没有太大的动力去做这件事情,尤其是考虑到php-cgi已经被开发出来了,可以让Windows特定的服务将其配置为fork pool。是的,它们之间还有差异,但并不足以推动社区对PHP-FPM进行完全重写。

    请记住,Windows上的php-cgi不仅仅是CGI的多个实例,而是使用由Windows管理的forked FastCGI处理器池,该池使用与PHP-FPM相同的架构。多个进程完成PHP的模块初始化,并从这些进程中维护多个fork(需要时进行重新启动)以处理请求。自PHP3早期以来,php-cgi就不再是一个CGI。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接