<?php 
//post.php
function Post($host,$port)
{
//$host="127.0.0.1";
//建立连接
$conn = fsockopen($host,$port);
if (!$conn) 
{
die("Con error");
}
//循环发送5次数据
//
for($i = 0;$i<5;$i++)
{
$data="user_name=admin".$i;
WriteData($conn,$host,$data);
echo $i."<br />";
}

fclose($conn);
}function WriteData($conn,$host,$data)
{
$header = "POST /test.php HTTP/1.1\r\n";
$header.= "Host : {$host}\r\n";
$header.= "Content-type: application/x-www-form-urlencoded\r\n";
$header.= "Content-Length:".strlen($data)."\r\n";
//Keep-Alive是关键
$header.= "Connection: Keep-Alive\r\n\r\n";
$header.= "{$data}\r\n\r\n";

fwrite($conn,$header);

//取结果
//$result = '';
//while(!feof($conn))
//{
 //   $result .= fgets($conn,128);
//}
//return $result;
}Post('127.0.0.1',80);

?>
<?php 
//test.php
$fp = fopen('result.txt','a');
$data = $_POST['user_name']." -- ". date('Y-m-d H:i:s')."\r\n";
fwrite($fp,$data);
fclose($fp);
?>
没什么技术难度
脑子一下子没转过来,每发一次都要建连接的方式太耗资源。用这种方式一次连接后,可以发多次数据,不过连接好像最长不超过30秒,不知道是哪里限制的。

解决方案 »

  1.   

    30秒好像是php.in中设置的你这个方法只能发送,不能接收返回值,这篇帖子讨论过
    http://topic.csdn.net/u/20100823/09/c8ea636b-31c7-41c4-9608-d4617c56e7f4.html
      

  2.   

    谢谢。
    我试了一下,确实存在你说的问题,只能读到第一个的结果,而且后面的post好像根本没传到服务器上。不过不做fgets的话数据都能post过去。看到你在那个贴子里说用curl,难道CURL用的不是SOCKET连接?用curl不存在像socket一样的问题吗?
      

  3.   

    30秒是在php.in中设置的。
    牛人!
      

  4.   

    cURL也是用socket,不过每次exec应该都有重新发送socket open
      

  5.   

    关键在于LZ是基于http请求,keep-alive是http/1.1标准,需要服务器支持http1.1,请求头keep-alive只是发送一次http是否使用上次打开的socket句柄。
    如果是更上一层的tcp,c/s两端就可以互相实时监听,b/s的话需要借助flash作为socket client.
      

  6.   

    那我每次都发送keep-alive,并且使用同一个SOCKET句柄的做法对不对?还是说每次都要用fsocketopen建立一个新连接,只要有keep-alive的话,HTTP会自动使用上次的SOCKET句柄?我的需求是:尽量少的建立连接,来发送大量数据,不希望每发一次数据,就建立一次连接