将get数据传递到php-cgi比较容易,但是将post或cookie数据传递到php-cgi,稍微复杂一些,需要了解php-cgi的一些接口环境变量。下面分别讲一下在dos环境和shell环境如何post数据到php-cgi。

 
windows系统
 
批处理t.bat脚本代码:
 
  
  1. set REDIRECT_STATUS=true 
  2. set SCRIPT_FILENAME=d:\php\test.php 
  3. set REQUEST_METHOD=POST 
  4. set GATEWAY_INTERFACE=CGI/1.1 
  5. set CONTENT_LENGTH=16 
  6. set CONTENT_TYPE=application/x-www-form-urlencoded 
  7. set HTTP_COOKIE=PHPSESSID=vfg5csi76qpt3qlfml359ad210 
  8. set QUERY_STRING=id=123 
  9. echo test=hello world | d:\php\php-cgi.exe 
  10. pause 
 
php代码 test.php
 
 
  
  1. setcookie('name','xxoo'); 
  2. echo "get:"
  3. print_r($_GET); 
  4.   
  5. echo "\r\npost:"
  6. print_r($_POST); 
  7.   
  8. echo "\r\ncookie:"
  9. print_r($_COOKIE); 
执行t.bat,输出结果:

linux系统
 
t.sh脚本代码
 
 
   
  1. export REDIRECT_STATUS=true 
  2. export SCRIPT_FILENAME=/var/www/test.php 
  3. export REQUEST_METHOD=POST 
  4. export GATEWAY_INTERFACE=CGI/1.1 
  5. export CONTENT_LENGTH=16 
  6. export CONTENT_TYPE=application/x-www-form-urlencoded 
  7. export HTTP_COOKIE=PHPSESSID=vfg5csi76qpt3qlfml359ad210 
  8. export QUERY_STRING=id=123 
  9. 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全局变量。