Chinaunix

标题: feof用于http流时需要注意的问题 [打印本页]

作者: ljj8384    时间: 2010-03-03 12:13
标题: feof用于http流时需要注意的问题
本帖最后由 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哲学中“健壮原则:健壮源于透明和简洁”来总结这次发现的问题再合适不过
作者: sanders_yao    时间: 2010-03-03 18:58
学习学习
作者: rzhome    时间: 2010-03-09 17:37
以前也碰到这样的问题,但不明白原因。
作者: HonestQiao    时间: 2010-03-10 13:12
网络通信,不像本地是很确定的流,包括read等,都最好类似处理一下子。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2