> 백엔드 개발 > PHP 튜토리얼 > socket的timeout有关问题

socket的timeout有关问题

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-06-13 12:01:58
원래의
1920명이 탐색했습니다.

socket的timeout问题
近来经常用到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都好用,既然这样,是不是任何二进制文件都可以用读文本的方式来读取或写入呢?
问题有点多了,不过都很本质,哪位同仁大哥扫扫盲哟。
------解决方案--------------------
socket_set_timeout 是 stream_set_timeout 的别名
1、是的
2、每块读取前的等待时间
即 $timeout2 时间内还没有读到数据,则算作失败
3、默认是无限等待,既然你想限制等待时间,那你自然要为的行为负责
4、fread 用于以二进制方式读取数据,除最后一块外,没快的长度都是一样的
      fgets 用于以文本方式读取数据,遇到 \n 就停止,遇到 \x1a 就算文件结束
      就数据而言,都是二进制的,所谓文本是加了些约束
      file_get_contents 和 file_put_contents 都是以二进制方式读写文件的

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿