socket的timeout问题

顽石开化 2014-07-06 04:04:59
近来经常用到fsockopen,因此对它的超时设置留意起来了,发现有多处可以设置,但不明就里,google打不开,baidu又不行,只好将此基础问题求助于同仁了。
看代码吧,
if (!$fp = @fsockopen($host, $this->port?$this->port:80, $errno, $errstr, $timeout1)) {
fclose($fp);
return false;
}
socket_set_timeout($fp, $timeout2);

while (!feof($fp)) {
$line = fgets($fp, 4096);
fclose($fp);
break;
}
问题:1、上面有两个timeout: $timeout1和 $timeout2,这两个timeout有什么区别呢?是否前者只用于建立连接,后者只用于读取数据?
2、$timeout2是用来控制fsockopen到fclose这个区间的时间限制,还是控制每次fgets时的数据限制呢?
3、如果 fgets($fp, 4096)的第二个参数即4096我给设置的非常大,譬如1亿秒,是否就需要相应的把$timeout2设置的大些呢?
4、我知道fread用于读取二进制数据,另外,php中还有个file_get_contents,那file_get_contents的内核用的是fread还是fgets呢?读取二进制时,我试过fgets和fread都好用,既然这样,是不是任何二进制文件都可以用读文本的方式来读取或写入呢?
问题有点多了,不过都很本质,哪位同仁大哥扫扫盲哟。
...全文
897 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
顽石开化 2014-07-06
  • 打赏
  • 举报
回复
感谢版主大哥这么快就予了回复,回答的很清楚。想再请教下: 利用socket在读取远端网页时,我看别人的代码一般都用如下循环语句, while (!feof($fp)) { $line = fgets($fp, 4096); break; } 觉得很奇怪,心想为什么不用fread ( $handle, $length )呢,只需把$length设置得足够大就行了。用fgets一行一行读取又有什么好处呢?
xuzuning 2014-07-06
  • 打赏
  • 举报
回复
socket_set_timeout 是 stream_set_timeout 的别名 1、是的 2、每块读取前的等待时间 即 $timeout2 时间内还没有读到数据,则算作失败 3、默认是无限等待,既然你想限制等待时间,那你自然要为的行为负责 4、fread 用于以二进制方式读取数据,除最后一块外,没快的长度都是一样的 fgets 用于以文本方式读取数据,遇到 \n 就停止,遇到 \x1a 就算文件结束 就数据而言,都是二进制的,所谓文本是加了些约束 file_get_contents 和 file_put_contents 都是以二进制方式读写文件的

21,893

社区成员

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

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