免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2323 | 回复: 3
打印 上一主题 下一主题

feof用于http流时需要注意的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-03 12:13 |只看该作者 |倒序浏览
本帖最后由 ljj8384 于 2010-03-03 12:14 编辑

原文出处:http://hi.baidu.com/cunsheng0929 ... 04a6ff0ad1872e.html,欢迎大家讨论和指正

昨天CH说发现一个问题,同样调用一个http接口,curl实现比fsockopen+fgets+feof实现快很多,second级的差别,问题虽已解决,但准确原因没有进一步追究,于是做了一个实验,得到一些结论这里与大家分享

为了排除干扰因素,HX将发起http请求的代码提取出来单独做了两个脚本,一个curl实现,一个fsockopen+fgets+feof实现,大致如下



curl脚本的执行时间在0.08s左右,比较正常,fgets脚本的执行时间却在10.08s,通过strace结果看了一下fread脚本产生的系统调用,发现有5次2s的poll超时后,由服务器主动关闭了连接,见下图



查看apache的KeepAlive设置,KeepAliveTimeout为10,与strace的结果吻合,将KeepAlive设置为Off后,fgets的执行时间变得与curl相差无几,由此看来,问题是由于feof函数挂起等待EOF标志,apache输出response后等待下一个请求,从而形成了双方互相等待造成

网络交互一般也不会以EOF为结尾标志,对此PHP手册中对feof函数用于判断网络流是否完成给出了workaround实现



PHP的feof不同于C的feof -> int feof(FILE *stream); 即可用于文件流还可用于网络流,用《unix编程艺术》一书中提倡的unix哲学中“健壮原则:健壮源于透明和简洁”来总结这次发现的问题再合适不过

论坛徽章:
0
2 [报告]
发表于 2010-03-03 18:58 |只看该作者
学习学习

论坛徽章:
0
3 [报告]
发表于 2010-03-09 17:37 |只看该作者
以前也碰到这样的问题,但不明白原因。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
4 [报告]
发表于 2010-03-10 13:12 |只看该作者
网络通信,不像本地是很确定的流,包括read等,都最好类似处理一下子。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP