我是一名Java Coder,本该灿烂过一生

但不幸碰到了PHP-CGI

这玩意在Windows环境下,自觉地闪退

导致我的网站无法访问、崩溃

这个行为,非常的不好

所以,今天,必须盘他

本来想简单的做一下,发现有牛逼的知识,很详细,那我就“复杂”而为之

什么是CGI?

CGI是common gateway interface的缩写,大家都译作通用网关接口,但很不幸,我们无法见名知意。 他是一个协议、是一种规范。

我们知道,web服务器所处理的内容都是静态的,要想处理动态内容,需要依赖于web应用程序,如php、jsp、python、perl等。但是web server如何将动态的请求传递给这些应用程序?它所依赖的就是cgi协议。没错,是协议,也就是web server和web应用程序交流时的规范。换句话说,通过cgi协议,再结合已搭建好的web应用程序,就可以让web server也能”处理”动态请求(或者说,当用户访问某个特定资源时,可以触发执行某个web应用程序来实现特定功能),你肯定知道处理两字为什么要加上双引号。

网络请求与返回的工作流程

例如,在谷歌搜索栏中搜索一个关键词”http”,对应的URL为:

https://www.google.com/search?q=http&oq=http&aqs=chrome..69i57j69i60l4j0.1136j0j8&sourceid=chrome&ie=UTF-8

当web server收到该请求后,先分析该url,(请求地址:https://www.google.com/search,请求参数q=http&oq=http&aqs=chrome..69i57j69i60l4j0.1136j0j8&sourceid=chrome&ie=UTF-8,其中像ie=UTF-8的就是环境变量)

从中知道了要执行search程序,并且还知道了一系列要传递给search的参数及其对应的value。web server会将这些程序参数和其它一些环境变量根据cgi协议通过TCP或套接字等方式传递给已启动的cgi程序(可能是cgi进程,或者是已加载的模块cgi模块)。当cgi进程接收到web server的请求后,调用search程序并根据web server传递参数执行指定的内容。search执行结束后,cgi进程/线程将处理结果返回给web server,web server再返回给浏览器。

有多种方式可以执行cgi程序,但对http的请求方法来说,只有get和post两种方法允许执行cgi脚本(即上面的search程序)。实际上post方法的内部本质还是get方法,只不过在发送http请求时,get和post方法对url中的参数处理方式不一样而已。

任何一种语言都能编写CGI,只不过有些语言比较擅长,有些语言则非常繁琐,例如用bash shell开发,那么需要用echo等打印语句将执行结果放在巨多无比的html的标签中输出给客户端。常用于编写CGI的语言有perl、php、python等,java也一样能写,但java的servlet完全能实现CGI的功能,且更优化、更利于开发。

正文

首先,我们要知道什么是php-cgi?

php-cgi 只是解释PHP脚本的程序而已,这玩意,在windows环境下,自动闪退,很恶心是吧!

这话怎么理解?就是从实际操作理解吧:nginx无法解析.php后缀的文件,怎么办,就需要能解析.php的软件来解析呗,这个php-cgi就是这个作用!

想一下避免的方案

我想了一下 通过 .bat + Java + nginx 500errorhtml 来解决

首先,一旦nginx爆500系错误,那么说明服务器挂了,这个时候nginx会自动跳转到500errorhtml,这个时候我们修改它,让他访问Java接口,Java接口做什么了呢?执行.bat 先停止名为nginx和php-cgi的进程,然后在执行.bat启动nginx+php+cgi

更加专业的解决办法

想象,确实可以实现对吧,但是暂时一名Java Coder,还是要“入乡随俗”,让PHP自己的方式解决自己的问题。

下载:PHP-FPMhttps://github.com/78/xxfpm

下载:RunHiddenConsole.exehttps://github.com/wenshui2008/RunHiddenConsole

不需要编译:里面有它自己的exe文件,已经生成好了

看到图中的路径没 bin目录下有,复制xxfpm.exe、xxfpm、pthreadGC2.dll就行了

放到与RunHiddenConsole.exe一起就行

放到你的服务器上,或者服务器软件上,哪里其实无所谓,但是,你必须能找到它

然后 开始编写.bat启动命令

由于有些单行代码过长,下面代码已经用空格分行了(只要是不是空格隔行的代码 就是一行,请不要乱换行哦)记得 .bat 的文件编码格式为ASCII ,这个不改,命令行输出可能会出现中文乱码,但不影响使用

启动代码格式(这里会有不同文件的路径)

REM Start.bat 启动服务脚本
@ECHO OFF

CD RunHiddenConsole所在的目录
ECHO Starting PHP FastCGI...

REM RunHiddenConsole.exe php所在的目录/php-cgi.exe -b 127.0.0.1:9000 -c php所在的目录/php.ini

start RunHiddenConsole.exe xxfpm.exe "php所在的目录/php-cgi.exe -c php所在的目录/php.ini" -n 8 -i 127.0.0.1 -p 9000

ECHO Starting nginx-1.18.0...

CD F:/wordpressRun

start RunHiddenConsole nginx所在的目录/nginx.exe -p nginx所在的目录

PAUSE

启动命令示例

REM Start.bat 启动服务脚本
@ECHO OFF

CD F:/wordpressRun

ECHO Starting PHP FastCGI...

REM RunHiddenConsole.exe php7\php-cgi.exe -b 127.0.0.1:9000 -c php7\php.ini

start RunHiddenConsole.exe xxfpm.exe "php7.4\php-cgi.exe -c php7.4\php.ini" -n 8 -i 127.0.0.1 -p 9000

ECHO Starting nginx-1.18.0...

CD F:/wordpressRun

start RunHiddenConsole F:/wordpressRun/nginx-1.18.0/nginx.exe -p F:/wordpressRun/nginx-1.18.0

PAUSE
完成,这个窗口可以关闭。

关闭代码

@echo off
echo Stopping nginx...  
taskkill /F /IM nginx.exe > nul
echo Stopping PHP FastCGI...
taskkill /F /IM php-cgi.exe > nul
@pause
exit
窗口关闭,无所谓,这事Hide的控制台,后台不显示窗口哦