分享,php模拟socket一次连接,多次发送数据的实现

codeyell-com 2010-08-24 05:36:16

<?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秒,不知道是哪里限制的。
...全文
673 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
codeyell-com 2010-08-25
  • 打赏
  • 举报
回复
那我每次都发送keep-alive,并且使用同一个SOCKET句柄的做法对不对?

还是说每次都要用fsocketopen建立一个新连接,只要有keep-alive的话,HTTP会自动使用上次的SOCKET句柄?

我的需求是:尽量少的建立连接,来发送大量数据,不希望每发一次数据,就建立一次连接

[Quote=引用 6 楼 boojs 的回复:]
关键在于LZ是基于http请求,keep-alive是http/1.1标准,需要服务器支持http1.1,请求头keep-alive只是发送一次http是否使用上次打开的socket句柄。
如果是更上一层的tcp,c/s两端就可以互相实时监听,b/s的话需要借助flash作为socket client.
[/Quote]
BooJS 2010-08-24
  • 打赏
  • 举报
回复
关键在于LZ是基于http请求,keep-alive是http/1.1标准,需要服务器支持http1.1,请求头keep-alive只是发送一次http是否使用上次打开的socket句柄。
如果是更上一层的tcp,c/s两端就可以互相实时监听,b/s的话需要借助flash作为socket client.
codeyell-com 2010-08-24
  • 打赏
  • 举报
回复
那就是每次都要重新建立连接了?

这样的话效率比较低。

[Quote=引用 4 楼 cunningboy 的回复:]
cURL也是用socket,不过每次exec应该都有重新发送socket open
[/Quote]
CunningBoy 2010-08-24
  • 打赏
  • 举报
回复
cURL也是用socket,不过每次exec应该都有重新发送socket open
codeyell-com 2010-08-24
  • 打赏
  • 举报
回复
30秒是在php.in中设置的。
牛人!
codeyell-com 2010-08-24
  • 打赏
  • 举报
回复
谢谢。
我试了一下,确实存在你说的问题,只能读到第一个的结果,而且后面的post好像根本没传到服务器上。不过不做fgets的话数据都能post过去。

看到你在那个贴子里说用curl,难道CURL用的不是SOCKET连接?用curl不存在像socket一样的问题吗?


[Quote=引用 1 楼 cunningboy 的回复:]
30秒好像是php.in中设置的

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

你这个方法只能发送,不能接收返回值,这篇帖子讨论过
http://topic.csdn.net/u/20100823/09/c8ea636b-31c7-41c4-9608-d4617c56e7f4.html

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧