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

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

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

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

先实现一个简单的GET请求

php代码

<?php
print_r($_GET);

命令

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

输出

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

php代码

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

转载于:https://my.oschina.net/u/222608/blog/1345626

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值