如何使用cgi-fcgi命令访问php-fpm实现HTTP请求

因为特殊的部署方式,一个nginx后面挂了多个php服务器,当须要遍历这些php服务器的时候,出现了一个蛋疼的问题,没有办法经过普通HTTP请求的方式遍历到全部的php服务器。php

好在找到一个简单的解决方案。html

cgi-fcgi命令实现了 fastcgi 客户端协议,能够直接访问php-fpm实现HTTP请求。nginx

先实现一个简单的GET请求

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的请求

实现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架构师

相关文章
相关标签/搜索