如何使用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架構師

相關文章
相關標籤/搜索