>  기사  >  백엔드 개발  >  PHP의 소켓 함수

PHP의 소켓 함수

不言
不言원래의
2018-05-04 15:16:111784검색

이 글에서는 PHP의 소켓 기능을 주로 소개하는데, 이는 특정 참고 가치가 있습니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

소켓을 기반으로 하는 애플리케이션을 만들려면 소켓의 작동 방법을 이해해야 합니다. 자세히, 여기에 PHP의 몇 가지 중요한 소켓 기능이 있습니다.

1. socket_create ( int $domain , int $type , int $protocol )

이 기능은 사용 소켓을 생성하려면 세 개의 매개변수가 있고 반환 값은 핸들(리소스)입니다.

$domain은 소켓을 생성할 때 사용되는 통신 프로토콜 제품군을 지정합니다. 선택적 값은 다음과 같습니다.

  • AF_INET: IPv4에 기반한 인터넷 프로토콜

  • AF_INET6: based IPv6 인터넷 프로토콜 internetAf_unix : UNIX 로컬 커뮤니케이션 프로토콜

  • $ 유형의 소켓 통신 유형은 다음과 같습니다. , 전이중, 연결 기반 바이트 스트림 전송, TCP 지원

SOCK_DGRAM: 데이터그램 스타일 제공, 비연결, 고정된 최대 길이, 자동 주소 지정 기능 전송, UDP

  • SOCK_SEQPACKET 지원: 직렬화된 제공 , 안정적인 이중 채널, 연결 기반 데이터그램 전송

  • SOCK_RAW: 원래 네트워크 액세스 프로토콜을 제공하고 특수 프로토콜 유형 소켓을 수동으로 구축할 수 있으며 ICMP 요청(예: 핑)을 지원합니다.

  • SOCK_RDM: 안정적인 데이터그램 전송을 제공하지만 순서는 보장할 수 없습니다.

  • $protocol은 ICMP, UDP, TCP를 포함하여 소켓이 사용하는 특정 전송 프로토콜을 지정하며 상수 SOL_UDP는 UDP에 해당하고 상수 SOL_TCP는 일정한 TCP.

2. 문자열

$address [, int $port

= 0

] ) 이 기능은 IP 주소와 3개의 매개변수가 있으며 부울 값을 반환합니다.

$socket은 소켓_create 함수에 의해 생성된 핸들을 나타내는 필수 매개변수입니다.

$address는 바인딩할 IP 주소를 나타내는 필수 매개변수입니다.

$port는 바인딩할 포트 번호를 나타내는 선택적 매개 변수이며, 소켓 연결을 모니터링하는 데 사용되는 포트를 지정하는 매개 변수입니다. 지정해야 합니다.

3. $socket [, int $backlog = 0 ] ) 이 기능은 모니터링하는 데 사용됩니다. 연결하려는 소켓 연결입니다. 소켓의 상호 작용 유형이 SOCK_STREAM 또는 SOCK_SEQPACKET인 경우에만 사용할 수 있으며, 부울 값을 반환합니다. $socket

은 필수 매개변수로, 소켓_create 함수에 의해 생성된(호스트에 바인딩된) 핸들을 나타냅니다. $backlog는 핸들 대기를 나타내는 선택적 매개변수입니다. 대기열에서 처리됩니다( 백로그에 허용되는 최대 연결 수입니다.

4.

socket_set_block ( resource $socket )

이 함수는 소켓 핸들을 차단 모드로 설정하는 데 사용되며 부울 값을 반환합니다. 값. 비차단 모드 소켓을 차단 모드로 변환할 수 있습니다.

블로킹 모드 소켓에서 작업(수신, 보내기, 연결, 수락 등)을 수행할 때 스크립트는 신호를 받거나 작업을 완료할 때까지 실행을 일시 중지합니다.

$socket은 유효한 소켓 핸들(socket_create 또는 소켓_accept에 의해 생성됨)을 나타내는 필수 매개변수입니다. 차단 모드와 비차단 모드의 차이점을 간략하게 소개합니다.

비 차단이란 결과를 즉시 얻을 수 없을 때까지 함수 작업이 현재 스레드를 차단하지 않고 즉시 반환한다는 의미입니다. 차단이란 작업을 완료할 때까지 다시 돌아올 수 없다는 의미입니다. 다음 단계를 계속하려면 먼저 상대방으로부터 응답을 받아야 합니다. 특히 사용자가 많을 경우에는 논블로킹으로 설정하는 것이 필요합니다. 차단 모드인 경우 두 클라이언트가 동시에 연결된 경우 서버가 한 클라이언트의 요청을 처리하는 동안 다른 클라이언트의 요청은 차단됩니다. 이전 클라이언트의 업무가 처리된 후에야 후자 클라이언트의 요청이 처리됩니다. 응답될 것입니다. [ ,

int

$length = 0 ] ) 이 함수는 지정된 크기의 버퍼 데이터를 소켓에 쓰는 데 사용되며 세 개의 매개변수를 가지며 작성된 데이터의 바이트 수를 반환합니다. $socket은 필수 매개변수이며 유효한 소켓 핸들을 나타냅니다. $buffer는 작성할 문자열 데이터를 지정하는 필수 매개변수입니다. $length는 소켓에 차례로 기록될 데이터의 바이트 수를 지정하는 선택적 매개변수입니다. 해당 값이 $buffer의 바이트 수보다 크면 자동으로 가로채게 됩니다. $버퍼 길이(바이트)입니다.


6.
,

int $length [, int $type = PHP_BINARY_READ ] )

이 함수는 소켓에서 지정된 바이트 길이의 데이터를 읽는 데 사용되며 세 개의 매개변수가 있으며 읽은 문자열 데이터를 반환합니다.

$socket은 필수 매개변수이며 유효한 소켓 핸들을 나타냅니다.
$length는 읽을 바이트 길이를 지정하는 필수 매개변수입니다.

$type은 선택적 매개변수입니다. 기본값은 PHP_BINARY_READ입니다. 이는 바이너리 데이터를 안전하게 읽을 수 있음을 의미합니다. 또 다른 선택적 값은 PHP_NORMAL_READ입니다. 이는 r 또는 n이 발견되면 읽기를 중지함을 의미합니다.

7. pfsockopen(string $hostname[, int $port = -1[, int &$errno[, 문자열 &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

이 함수는 영구 소켓 연결, 즉 긴 연결을 구현하는 데 사용되며 반환됩니다. 손잡이. fsockopen과의 차이점은 pfsockopen에 의해 설정된 연결은 스크립트가 실행된 후에도 끊어지지 않는다는 것입니다.

8. socket_set_option ( resource$socket , int$level , int$optname , mixed$optval )

이 함수는 소켓 제어 옵션을 설정하는 데 사용됩니다. 이 함수에는 4개의 매개변수가 있으며 부울 값을 반환합니다.

$socket은 필수 매개변수이며 유효한 소켓 핸들을 나타냅니다.

$level은 옵션이 적용되는 프로토콜 수준을 지정하는 필수 매개변수입니다. 일반적으로 상수 SOL_SOCKET을 사용합니다.

$optname은 제어할 옵션의 이름을 지정하는 필수 매개변수입니다.

$optval은 옵션 값을 지정하는 필수 매개변수입니다.

9.socket_last_error ([resource$socket ] )

이 함수는 소켓 함수에서 생성된 마지막 오류 코드를 가져오는 데 사용되며 반환 값은 정수입니다.

10. 이 함수는 오류 코드로 표시되는 오류 설명을 얻는 데 사용됩니다. 의 경우 반환 값은 문자열입니다. 저급 프로그래머가 아닌 사람으로서 소켓의 내부 구현 메커니즘을 깊이 이해하는 것은 매우 어렵습니다. 소켓이 프로세스 통신을 구현하기 위해 운영 체제에 의해 캡슐화된 함수 집합이라는 점만 이해하면 됩니다. 생성하고 호출합니다. PHP의 언어 특성과 위치에 따라 소켓 서버가 아닌 소켓 클라이언트에만 적합하다고 판단됩니다. 소켓은 주로 하위 계층 및 네트워크 서비스 개발을 지향하기 때문에 서버 측은 일반적으로 C 또는 Java와 같은 언어로 구현됩니다. 이는 하위 계층을 더 잘 작동할 수 있으며 네트워크에서 발생하는 문제를 해결하는 데도 성숙합니다. 서비스 개발(예: 동시성, 차단 등) 완벽한 솔루션이지만 PHP는 분명히 이 애플리케이션 시나리오에 적합하지 않습니다. 사실 PHP는 소켓을 통해 MySQL 데이터베이스를 운영합니다. 이는 소켓이 기본 프로토콜을 보호하여 네트워크 서비스 간의 상호 연결을 간단하게 만들기 때문입니다. 기존의 서버 측 언어로 구현된 소켓 외에도 HTML5의 인기로 인해 브라우저 클라이언트에 구현된 WebSocket도 점차 등장하고 있습니다. 이 역시 주목할 만한 솔루션입니다.

클라이언트에서 소켓을 동작시키기 위해서는 fsockopen, 소켓_create, stream_socket_client 등의 함수를 사용할 수 있습니다. PHP5라면

stream_socket_client 사용을 권장합니다.

Socket 대화형 응용 프로그램 예: 소켓을 사용하여 양식 제출

새 테스트 만들기 .php 파일, 양식 데이터를 http://demo.com/index.php?id=1에 제출하면 코드는 다음과 같습니다

[php] view plain copy
<?php  
$data = array(&#39;comment&#39;=>&#39;this is a robot comment&#39;);  
$data = http_build_query($data);  
$out = "POST http://demo.com/index.php?id=1 HTTP/1.1\r\n";  // 通过POST方式发送数据  
$out .= "Host: demo.com\r\n";  
$out .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n";  
$out .= "Content-length: ".strlen($data)."\r\n";  
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0"."\r\n";  
$out .= "Connection: close"."\r\n"."\r\n";    // 注意:此处有两个 \r\n
$out .= $data."\r\n";   // 正文数据
$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);  // 创建socket客户端连接
// $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);  推荐这种写法
fwrite($fp, $out);    // 向服务器发送数据
while (!feof($fp)) {  
    echo fgets($fp, 1280);    // 读取服务器响应的数据
}  
fclose($fp);  // 关闭socket连接
?>

다음 사항에 주의해야 합니다.

  • fsockopen的第一个参数,也可以使用IP地址,不要带 http:// 字符串,除非使用SSL等

  • 请求头(headers)不一定要带上所有的头域,一般只需带上几个核心的header即可

  • 在最后一个header处,即 Connection 后有两个换行

  • 注意编码问题

如果是PHP5,建议使用 stream_socket_client 代替 fsockopen,也就是将下面的代码:

$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);

改为:

$fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);

在PHP中,99.9%的socket应用属于流套接字的范畴,由于数据包套接字和原始套接字涉及比较底层的协议知识,这里就不作深究,有兴趣的朋友可自行学习。

相关推荐:

PHP中PDO事务处理操作示例


위 내용은 PHP의 소켓 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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