将get数据传递到php-cgi比较容易,但是将post或cookie数据传递到php-cgi,稍微复杂一些,需要了解php-cgi的一些接口环境变量。下面分别讲一下在dos环境和shell环境如何post数据到php-cgi。
windows系统
批处理t.bat脚本代码:
- set REDIRECT_STATUS=true
- set SCRIPT_FILENAME=d:\php\test.php
- set REQUEST_METHOD=POST
- set GATEWAY_INTERFACE=CGI/1.1
- set CONTENT_LENGTH=16
- set CONTENT_TYPE=application/x-www-form-urlencoded
- set HTTP_COOKIE=PHPSESSID=vfg5csi76qpt3qlfml359ad210
- set QUERY_STRING=id=123
- echo test=hello world | d:\php\php-cgi.exe
- pause
php代码 test.php
- setcookie('name','xxoo');
- echo "get:";
- print_r($_GET);
- echo "\r\npost:";
- print_r($_POST);
- echo "\r\ncookie:";
- print_r($_COOKIE);
执行t.bat,输出结果:
linux系统
t.sh脚本代码
- export REDIRECT_STATUS=true
- export SCRIPT_FILENAME=/var/www/test.php
- export REQUEST_METHOD=POST
- export GATEWAY_INTERFACE=CGI/1.1
- export CONTENT_LENGTH=16
- export CONTENT_TYPE=application/x-www-form-urlencoded
- export HTTP_COOKIE=PHPSESSID=vfg5csi76qpt3qlfml359ad210
- export QUERY_STRING=id=123
- echo test=hello world | php-cgi
/var/www/test.php 跟在上面的test.php一样
执行
chmod 777 t.sh
./t.sh
输出结果
数据是如何传递的呢?
echo test=hello world | php-cgi
echo test=hello world会得到test=hello world,因为有管道符| 所以会把第一个命令的输出传递到第二个命令的输入管道中
原理总结:
在dos通过set和在linux通过export设置环境变量,在php中可以通过$_SERVER['环境变量名']去获取。
$_SERVER['QUERY_STRING']=”id=123″ 会被解析到$_GET全局变量中
$_SERVER['HTTP_COOKIE']=”PHPSESSID=vfg5csi76qpt3qlfml359ad210″ 会被解析到$_COOKIE全局变量中
$_SERVER['REQUEST_METHOD'] =”POST”
$_SERVER['CONTENT_LENGTH'] =16
$_SERVER['CONTENT_TYPE'] =”application/x-www-form-urlencoded”设置了这三个变量,php会从管道中读取16个字节,并解析到$_POST全局变量。
转载于:https://blog.51cto.com/golang/804276