>  기사  >  백엔드 개발  >  PHP의 소켓 연결 분석 및 데이터 읽기 및 쓰기 시간 초과 문제

PHP의 소켓 연결 분석 및 데이터 읽기 및 쓰기 시간 초과 문제

不言
不言원래의
2018-06-02 11:31:561555검색

이 글에서는 주로 소켓 연결과 PHP의 데이터 읽기 및 쓰기 시간 초과 문제를 소개하고, 소켓 연결과 관련된 설정 및 사용 기술을 분석합니다. 도움이 필요한 친구들이 참고할 수 있습니다

이 글에서는 소켓 연결 및 데이터 읽기 및 쓰기에 대해 설명합니다. 예제 질문으로 인해 PHP에서 시간 초과가 발생했습니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

PHP에는 fsockopen() 메서드에 대한 소켓 연결을 위한 시간 초과 매개 변수가 있지만 다음과 같이 성공적인 연결 후 데이터를 읽고 쓰기 위한 시간 초과 매개 변수 설정은 없습니다. C에서 상관없습니다. PHP는 시간 초과를 방지하기 위해 스트림에 대한 일련의 메서드를 제공합니다

stream_set_blocking( $fp , false )

데이터 스트림을 차단 모드로 설정하여 데이터를 읽기 전에 데이터가 종료되는 것을 방지합니다

모드가 false인 경우, 주어진 소켓 설명자는 비블록 모드로 전환합니다. true이면 블록 모드로 전환합니다. 이 효과는 소켓에서 fgets()를 읽는 것과 유사합니다. 블록 모드에서는 fgets()가 즉시 반환됩니다. 요구 사항이 충족될 때까지 기다립니다.

stream_set_timeout( $fp , 10 )

이 문장은 연결이 성공적으로 설정된 후 즉시 추가되어야 합니다. 다음 매개 변수 단위는 초

stream_get_meta_data( $fp )

Get입니다. 캡슐화 프로토콜 파일 포인터 및 반환의 헤더/메타데이터는 배열이며 형식은 다음과 같습니다.

Array
(
  [stream_type] => tcp_socket
  [mode] => r+
  [unread_bytes] => 0
  [seekable] =>
  [timed_out] =>
  [blocked] => 1
  [eof] =>
)

인덱스 timed_out은 시간 초과 정보입니다. 시간이 초과된 경우 true이고, 시간이 초과된 경우 true입니다. 타임아웃되지 않으면 거짓입니다. 이를 사용하여 소켓이 타임아웃되었는지 확인할 수 있습니다. 주의해야 할 점은 fwrite(), fread와 같이 기다려야 하는 각 명령문 뒤에 문장을 추가해야 한다는 것입니다. (), 읽을 때마다 타임아웃 여부를 판단해야 하며 연결의 경우 한 번의 타임아웃 설정 stream_set_timeout ( $fp , 10 )만 필요합니다

Code:

$fp = @fsockopen( $ip , $port, $errNo , $errstr, 30 );
if( !$fp )
{
  return false;
}
else
{
  stream_set_timeout( $fp , 3 ) ;
  //发送数据
  fwrite( $fp , $packet ) ;
  $status = stream_get_meta_data( $fp ) ;
  //发送数据超时
  if( $status['timed_out'] )
  {
    echo "Write time out" ;
    fclose( $fp );
    return false;
  }
  //读取数据
  $buf = fread( $fp , 16 ) ;
  $status = stream_get_meta_data( $fp ) ;
  //读取数据超时
  if( $status['timed_out'] )
  {
    echo "Read time out" ;
    fclose( $fp );
    return false;
  }
}

관련 추천:

PHP SCOKET은 대용량 파일을 보내고 JAVA_PHP 튜토리얼

을 받습니다.

위 내용은 PHP의 소켓 연결 분석 및 데이터 읽기 및 쓰기 시간 초과 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.