>  기사  >  백엔드 개발  >  PHP가 소켓에 적합하지 않은 이유는 무엇입니까?

PHP가 소켓에 적합하지 않은 이유는 무엇입니까?

(*-*)浩
(*-*)浩원래의
2019-10-19 15:02:212411검색

저급 프로그래머가 아닌 입장에서 소켓의 내부 구현 메커니즘을 깊이 이해하는 것은 매우 어렵습니다. 소켓이 프로세스 통신을 구현하기 위해 운영 체제에서 캡슐화한 함수 집합이라는 점만 이해하면 충분합니다. 생성하고 호출합니다.

PHP가 소켓에 적합하지 않은 이유는 무엇입니까?

PHP의 언어 특성과 위치에 따라 PHP는 소켓 서버가 아닌 소켓 클라이언트에만 적합합니다.

소켓은 주로 하위 계층 및 네트워크 서비스 개발을 지향하기 때문에 서버 측은 일반적으로 하위 계층을 더 잘 작동하고 네트워크 서비스에서 발생하는 문제를 해결할 수 있는 C 또는 Java와 같은 언어로 구현됩니다. 개발(동시성, 차단 등) 성숙하고 완전한 솔루션도 있지만 PHP는 분명히 이 애플리케이션 시나리오에 적합하지 않습니다. (추천 학습: PHP 비디오 튜토리얼)

사실 PHP는 소켓을 통해 MySQL 데이터베이스를 운영합니다. 이는 소켓이 기본 프로토콜을 보호하여 네트워크 서비스 간의 상호 연결을 간단하게 만들기 때문입니다.

HTML5의 인기로 인해 전통적인 서버 측 언어로 구현된 소켓 외에도 브라우저 클라이언트에 구현된 WebSocket도 점차 등장하고 있습니다. 이는 FlashSocket도 좋은 솔루션입니다.

클라이언트에서 소켓을 작동하려면 fsockopen,socket_create,stream_socket_client 등의 함수를 사용할 수 있습니다. PHP5라면 stream_socket_client를 사용하는 것이 좋습니다.

Socket 대화형 애플리케이션 예: 소켓을 사용하여 양식 제출

새 test.php 파일을 만들고 양식 데이터를 http://demo.com/index.php?id=1에 제출합니다.

<?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 주소를 사용할 수 있으므로 SSL 등을 사용하지 않는 한 http:// 문자열을 가져오지 마세요.

요청 헤더는 반드시 모두 가져올 필요는 없습니다. 헤더 필드의 경우 일반적으로 몇 개의 핵심 헤더만 가져와야 합니다. 마지막 헤더, 즉 Connection 이후에 두 개의 줄 바꿈이 있습니다.

위 내용은 PHP가 소켓에 적합하지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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