php fsockopen post data (模拟Post提交)

网上有很多的代码,但是实际上就只有一个,于是乎我一直认为他们是对的,花了一个上午的时间去理顺这个问题,最后我还是在国外的网站上看到了真确的答案,跟大家分享一下:

fsockopen页面代码:

$fp = fsockopen("example.com", 80);

$vars = array(
    "hello" => "world"
);
$content = http_build_query($vars);

fwrite($fp,"POST /reposter.php HTTP/1.1\r\n");
fwrite($fp,"Host: example.com\r\n");
fwrite($fp,"Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp,"Content-Length: ".strlen($content)."\r\n");
fwrite($fp,"Connection: close\r\n");
fwrite($fp,"\r\n");

fwrite($fp, $content);

header("Content-type: text/plain");
while (!feof($fp)) {
    echo fgets($fp, 1024);
}

接受post数据页面的代码:

 print_r($_POST);

 

 

这个是我的fsockopen页面的代码:

$domain="127.0.0.1";
$dport="8087";
$vars=array("content"=>"ff");
$post_data=http_build_query($vars);

$fp=fsockopen($domain,$dport,$errno,$errstr,1);
	if($errno!=0)
	{
	  die("not connect the host");
	}
	
	fputs($fp,"POST /open.php HTTP/1.0\r\n");
	fputs($fp,"Accept:*/*\r\n");
	fputs($fp,"Referer: $domain\r\n");
	fputs($fp,"Accept-Language:zh-cn\r\n");
	fputs($fp,"Content-Type:application/x-www-form-urlencoded\r\n");
	fputs($fp,"User-Agent:".$_SERVER['HTTP_USER_AGENT']."\r\n");
	fputs($fp,"HOST:$domain\r\n");
	fputs($fp,"Content-Length:".strlen($post_data)."\r\n");
	fputs($fp,"Connection:close\r\n");
	fputs($fp,"Cache-Control:no-cache\r\n\r\n");
	fputs($fp,$post_data);

        while(!feof($fp))
	{
	   $get.=fgets($fp,1024);
	}
	fclose($fp);

echo $get;

在使用fsockopen方法中,我遇到的最大的问题:

1、$post_data数据太多如果手动写成字符串容易出错,导致提交失败

2、在每一个fputs最后都有一个换行符,这个必须注意的是只有在倒数第二个fputs中才写了两次,这是为了区分下面的post数据用的,如果在其他地方没加或加上了都会导致模拟的文件头信息不完整或不正确,当然post提交也就失败了。

3、模拟文件头信息中的参数大小需要注意,大小写错误有时也会导致文件头信息解析失败,从而post提交失败。

另外,get提交和网上其他的做法一样比较简单,不容易出错,我这里就不再重复了,减少网络垃圾信息。不对的地方请大家指出。