因为特殊的部署方式,一个nginx后面挂了多个php服务器,当须要遍历这些php服务器的时候,出现了一个蛋疼的问题,没有办法经过普通HTTP请求的方式遍历到全部的php服务器。php
好在找到一个简单的解决方案。html
cgi-fcgi命令实现了 fastcgi 客户端协议,能够直接访问php-fpm实现HTTP请求。nginx
php代码c++
<?php print_r($_GET);
命令git
env USER=dev FCGI_ROLE=RESPONDER SCRIPT_FILENAME=/path/php/test/get.php QUERY_STRING="arg1=1" REQUEST_METHOD=GET SCRIPT_NAME=/get.php REQUEST_URI=/get.php DOCUMENT_URI=/get.php DOCUMENT_ROOT=/path/php/test SERVER_PROTOCOL=HTTP/1.1 GATEWAY_INTERFACE=CGI/1.1 SERVER_SOFTWARE=nginx/1.8.1 REMOTE_ADDR=127.0.0.1 REMOTE_PORT=50815 SERVER_ADDR=127.0.0.1 SERVER_PORT=80 SERVER_NAME=localhost REDIRECT_STATUS=200 HTTP_HOST=localhost HTTP_CONNECTION=keep-alive HTTP_CACHE_CONTROL=max-age=0 PHP_SELF=/index.php REQUEST_TIME_FLOAT=1499780545.7094 REQUEST_TIME=1499780545 cgi-fcgi -bind -connect 127.0.0.1:9000
输出github
X-Powered-By: PHP/5.6.30 Content-type: text/html; charset=UTF-8 Array ( [arg1] => 1 )
命令分为两部分,第一部分设置环境变量,也就是env命令,cgi-fcgi后面才是链接php-fpm的参数服务器
env命令设置的环境变量对应的php $_SERVER中的值,若是搞不清楚这里的环境变量怎么设置,能够将普通HTTP请求产生的$_SERVER变量,而后稍微修改使用,或者参考nginx fastcgi_params配置文件。架构
实现POST请求,我查遍了cgi-fcgi的文档、google、stackoverflow等都没有现成的实现方法,最后我根据fcgi的c/c++的实现,还有文档中post数据来源于stdin的描述,搞清楚了怎么用cgi-fcgi实现post请求app
php代码php-fpm
<php? print_r($_POST);
命令
env USER=dev FCGI_ROLE=RESPONDER SCRIPT_FILENAME=/path/php/test/post.php QUERY_STRING="" REQUEST_METHOD=POST CONTENT_TYPE="application/x-www-form-urlencoded" CONTENT_LENGTH=5 SCRIPT_NAME=/post.php REQUEST_URI=/post.php DOCUMENT_URI=/post.php DOCUMENT_ROOT=/path/php/test SERVER_PROTOCOL=HTTP/1.1 GATEWAY_INTERFACE=CGI/1.1 SERVER_SOFTWARE=nginx/1.8.1 REMOTE_ADDR=127.0.0.1 REMOTE_PORT=50815 SERVER_ADDR=127.0.0.1 SERVER_PORT=80 SERVER_NAME=localhost REDIRECT_STATUS=200 HTTP_HOST=localhost HTTP_CONNECTION=keep-alive HTTP_CACHE_CONTROL=max-age=0 PHP_SELF=/post.php REQUEST_TIME_FLOAT=1456138229.7094 REQUEST_TIME=1456138229 cgi-fcgi -bind -connect 127.0.0.1:9000 <<< "arg=1"
输出
X-Powered-By: PHP/5.6.30 Content-type: text/html; charset=UTF-8 Array ( [arg] => 1 )
post请求要注意CONTENT_LENGTH环境变量要和post的数据长度保持一致。
这样就能够访问任意php服务器了,能够向它们提交配置文件到local cache、刷新部分php文件的opcache等特殊操做了,固然它的玩法还不只限于此。
更多架构、PHP、GO相关踩坑实践技巧请关注个人公众号:PHP架构师