什么是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-FPM : https://github.com/78/xxfpm
下载:RunHiddenConsole.exe :https://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
完成,这个窗口可以关闭。
关闭Nginx Bat代码
@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的控制台,后台不显示窗口哦