小言_互联网的博客

windows环境以fastcgi方式运行php脚本

373人阅读  评论(0)

在说明fastcgi方式之前,先对php_module方式做一个简要说明

php_module方式的简要说明

常见的执行php脚本的方式是php_module 方式:
以apache2.4 及php7.2.4为例进行说明,在php_module方式执行时,php脚本的执行并不是在单独的进程中进行,而是由apache服器加载一个dll,这个dll负责php脚本的解释执行。

比如在apache的配置文件中下面的语句:

LoadModule php7_module D:/php7.2.4/php7apache2_4.dll
AddType application/x-httpd-php .php
PHPIniDir "D:/php7.2.4"

从以上配置可见,php7apache2_4.dll 负责解释执行php脚本,php7apache2_4.dll 并不是独立的进程,而是加载到apache的进程空间中执行。

fastcgi方式的简要说明

cgi或fastcgi方式执行时,解释执行php脚本的程序运行在独立的进程空间中,web服务器与解释执行php脚本的程序之间根据cgi协议进行通信。

以fastcgi方式运行脚本要搞清楚的问题:是什么程序在执行php脚本?
答案是 php-cgi.exe
php的发行版中都提供了这个php-cgi.exe。它是一个可以独立运行的可执行程序

在apahce的配置文件中有如下的语句:

FcgidWrapper "D:/php7.2.4/php-cgi.exe" .php 

以上这句配置就指明了真正执行php脚本的程序是 php-cgi.exe

apache 配置fastcgi

仅仅有上 一节所说的一句配置还不够,我们还得指明apache如何与php-cgi.exe打交道。因此下面是一个比较完整一点的配置

LoadModule fcgid_module modules/mod_fcgid.so  
AddType application/x-httpd-php .php  

<IfModule mod_fcgid.c>
AddHandler fcgid-script .php  
#php.ini的存放目录  
FcgidInitialEnv PHPRC "D:/php7.2.4"  
# 设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程在处理完所有请求前退出  
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 500  
#php-cgi每个进程的最大请求数  
FcgidMaxRequestsPerProcess 500  
#php-cgi最大的进程数  
FcgidMaxProcesses 20  
#最大执行时间  
FcgidIOTimeout 120  
FcgidIdleTimeout 120  
#php-cgi的路径  
FcgidWrapper "D:/php7.2.4/php-cgi.exe" .php 
</IfModule>  

从以上的配置可以看出来,为了让apache与php-cgi.exe交互,加载了模块 mod_fcgid.so
并且配置了一些相关的参数。

另外在配置中还要注意两点:

1,<IfModule mod_fcgid.c> 不要写成 <IfModule mod_fcgid> ,
虽然只是多了一个“.c",但会导致是否加载配置的问题。
否则 *.php文件都被当成了普通文件,而没有被php引擎解析执行

2,要在 “<Directory”指令节中 加上 “ Options ExecCGI”,
指明要执行CGI,当然option还可以带上其它的选项,但 "ExecCGI"不能省。

nginx 配置fastcgi

nginx与apache不一样,nginx是通过反向代理的方式与php-cgi.exe打交道。配置方式与apache不一样。
php-cgi.exe 与nginx是做为两个独立的进程分别启动

第一步,启动php-cgi.exe ,让它监听某个端口,这里以端口9000为例,在cmd窗口中执行如下命令

D:/php7.2.4/php-cgi.exe -b 127.0.0.1:9000

第二步,修改nginx配置,让它反向代理,指向端口9000,然后启动nginx
nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;  
    sendfile        on;    
    keepalive_timeout  65;   

    server {
        listen       9090;
        server_name  localhost;     

        location / {
            root   html;
            index  index.html index.htm index.php;
        }       
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000      
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}

以上配置中的关键一句是

fastcgi_pass   127.0.0.1:9000;

从以上配置可以看出,nginx实际上只负责把对*.php的请求转发到9000端口,至于是不是php-cgi.exe在监听9000端口,nginx并不关心。

在以上的配置中有一个问题,就是windows环境下,php-cgi.exe的运行非常不稳定,运行一段时间后就会崩
溃退出。在linux中有fpm管理,在windows环境下现在比较好用的FastCGI进程管理器是xxfpm.exe

改进的思路就是让xxfpm.exe管理php-cgi.exe,同进打开几个php-cgi.exe进程,当某个php-cgi.exe进程退出时,开启新的php-cgi.exe进程补上,使得php-cgi.exe的进程数目始终维持稳定。

前面已经说过,nginx并不关心是谁在监听9000端口,所以nginx的配置不用做改动。

只要下载xxfpm.exe到本地,并执行如下的命令开始监听9000端口即可:

xxfpm.exe "D:/php7.2.4/php-cgi.exe -c D:/php7.2.4/php.ini" -n 5 -i 127.0.0.1 -p 9000 

以上命令中 ,参数 -n 5 表示同时开启5个php.exe进程, -i 与 -p 分别指定ip与端口


转载:https://blog.csdn.net/littlezhuhui/article/details/101992366
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场