저자: 아르멜 포보
원래 주소: http://www.phpbuilder.net/columns/armel20010427.php3
번역자: Xu [email protected]
http://www.phpobject.net/blog/
PHP는 원격 또는 로컬 서버의 소켓을 열 수 있습니다! 다음은 소켓을 사용하는 간단한 예입니다. 유즈넷 뉴스 서버에 연결하고, 서버와 통신하고, 정확한 뉴스 그룹에서 일부 기사를 다운로드합니다.
PHP를 사용하여 소켓 열기
fsockopen()을 사용하여 소켓을 엽니다. 이 함수는 PHP3과 PHP4 모두에 존재합니다. 함수의 프로토타입은 다음과 같습니다.
<?php
intfsockopen
(문자열 호스트 이름,
정수 포트[,
정수 오류 번호[,
문자열 오류 문자열[,
이중 시간 초과]]])
?>
네트워크 호스트의 경우 호스트 이름의 포트에 대한 TCP 소켓 연결을 설정합니다. 호스트 이름은 도메인 이름이거나 IP 주소일 수 있습니다. UDP 연결의 경우 udp://hostname 프로토콜을 지정해야 합니다. Unix 호스트의 경우 호스트 이름은 소켓 경로에 사용되며 이 예에서는 포트를 0으로 설정해야 합니다. 선택적인 시간 초과를 사용하여 연결 시간 초과의 시간(초)을 설정할 수 있습니다.
fsockopen()에 대한 자세한 내용은 http://www.php.net/manual/function.fsockopen.php에서 확인할 수 있습니다.
네트워크 뉴스 전송 프로토콜(NNTP)
유즈넷 뉴스 서버에 액세스하려면 네트워크 뉴스 전송 프로토콜 표준인 NNTP라는 특수 프로토콜을 사용해야 합니다. 이 프로토콜의 세부사항은 RFC977에 있으며 http://www.w3.org/Protocols/rfc977/rfc977.html 에서 볼 수 있습니다. 이 문서에서는 다양한 명령을 사용하여 NNTP 서버에 연결하고 통신하는 방법을 자세히 설명합니다.
연결 서버 NNTP 서버에 연결하려면 서버의 호스트 이름(또는 IP 주소)과 서버가 수신할 포트를 알아야 합니다. 또한 연결이 실패할 때 프로그램이 "정지"되지 않도록 시간 제한을 추가하는 것이 좋습니다.
<?php
$cfgServer="your.news.host";
$cfg포트 =119;
$cfgTimeOut =10;
// 소켓 열기
if(!$cfgTimeOut)
// 타임아웃 없이
$usenet_handle=fsockopen($cfgServer,$cfgPort);
또 다른
// 시간 초과가 있는 경우
$usenet_handle=fsockopen($cfgServer,$cfgPort, &$errno, &$errstr,$cfgTimeOut);
if(!$usenet_handle) {
echo"연결 실패n";
출구();
}
또 다른 {
echo"연결됨n";
$tmp=fgets($usenet_handle,1024);
}
?>
서버와 상호 작용 이제 서버에 연결되었으며 이전에 열린 소켓 연결을 통해 서버와 상호 작용할 수 있습니다. 서버에 "특정 뉴스 그룹의 최신 10개 기사를 가져오고 싶습니다"라고 가정해 보겠습니다. RFC977은 올바른 뉴스 그룹을 선택하는 방법에 대한 명령을 다음과 같이 정의합니다.
그룹ggg
필수 매개변수 ggg는 net.news와 같이 선택하려는 뉴스 그룹의 이름입니다. list 명령을 사용하면 유효한 뉴스 목록을 얻을 수 있습니다. 성공적인 선택 응답은 그룹의 첫 번째 및 마지막 두 뉴스 기사의 뉴스 번호와 보관된 뉴스 번호의 추정치를 반환합니다.
예를 들어
크롬:~$ telnetmy.news.host 119
aa.bb.cc.dd 시도 중...
my.news.host에 연결되었습니다.
이스케이프 문자는 '^]'입니다.
200 my.news.hostInterNetNews NNRP 서버 INN 2.2.2 1999년 12월 13일 준비(게시 확인).
그룹 대체 테스트
211 232 222996 223235alt.test
그만두다
205.
"GROUP alt.test" 명령을 받은 후 뉴스 서버는 "211232 222996 223235 alt.test"를 반환했습니다. 211은 RFC 식별 코드입니다(명령이 성공적으로 실행되었다는 간단한 설명 - 자세한 내용은 RFC를 확인하세요). 반환된 정보는 232개의 기사가 있음을 나타냅니다. 그 중 가장 오래된 뉴스의 색인 번호는 222996이고, 최신 뉴스 색인 번호는 223235입니다. 이제 계산을 해보자: 222996+232는 232235와 같지 않다. 누락된 기사는 서버에서 제거되거나 작성자에 의해 취소되거나(예, 가능하고 쉽습니다) 삭제되었습니다.
예방 조치로 서버가 공개인지 비공개인지에 따라 뉴스 그룹을 선택하기 전에 서버에서 인증을 요구할 수 있습니다. 일반적으로 누구나 뉴스를 얻을 수 있지만 뉴스를 게시하려면 인증이 필요합니다.
<?php
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup="alt.php";
// 개인 서버에 ID가 필요합니다.
if($cfg사용자) {
fputs($usenet_handle,"AUTHINFO 사용자".$cfgUser."n");
$tmp=fgets($usenet_handle,1024);
fputs($usenet_handle,"AUTHINFOPASS".$cfgPasswd."n");
$tmp=fgets($usenet_handle,1024);
// 오류 확인
if($tmp!="281확인rn") {
echo "502인증 오류n";
출구();
}
}
// 뉴스그룹 선택
fputs($usenet_handle,"GROUP ".$cfgNewsGroup."n");
$tmp=fgets($usenet_handle,1024);
if($tmp=="480 명령에 인증이 필요함rn") {
echo "$tmpn";
출구();
}
$info=분할(" ",$tmp);
$first=$정보[2];
$last=$info[3];
print"첫번째 : $firstn";
print"마지막 : $lastn";
?>
일부 기사 가져오기 이제 최신 기사의 A 색인 번호가 있으므로 최신 10개 기사를 쉽게 얻을 수 있습니다. RFC977에는 ARTICLE 명령을 문서 색인 번호 또는 메시지 ID와 함께 사용할 수 있다고 명시되어 있습니다. 주의할 점은 여기서 기사의 색인 번호와 메시지 ID가 다르다는 것입니다. 뉴스 서버마다 정의가 다르기 때문에 뉴스 서버마다 동일한 기사의 색인 번호는 다르지만 메시지 ID는 달라야 합니다. (기사 헤더에 포함됨)
<?php
$cfgLimit =10;
// 지난 글 업로드
$boucle=$last-$cfgLimit;
동안 ($boucle<=$last) {
set_time_limit(0);
fputs($usenet_handle,"ARTICLE$bouclen");
$article="";
$tmp=fgets($usenet_handle,4096);
if(substr($tmp,0,3) !="220") {
echo"+---------+n";
echo"$boucle 문서에 오류가 있습니다n";
echo"+---------+n";
}
또 다른 {
while($tmp!=".rn") {
$tmp=fgets($usenet_handle,4096);
$article=$article.$tmp;
}
echo"+---------+n";
echo"Article$bouclen";
echo"+---------+n";
echo"$articlen";
}
$부클++;
}
?>
우리는 이 서버에서 이 그룹의 최신 뉴스 10개만 받습니다. HEAD 명령을 사용하여 기사의 헤더 정보를 가져오거나 BODY 명령을 사용하여 뉴스 본문을 가져올 수도 있습니다.
연결을 닫고 fclose() 함수를 사용하여 NNTP 서버와의 세션을 종료합니다. 물론 다음과 같이 새 파일을 만들 수 있습니다.
<?php
// 연결 끊기
fclose($usenet_handle);
?>
fclose()에 대한 자세한 내용은 http://www.php.net/manual/function.fclose.php를 참조하십시오.
결론 이 기사에서는 특정 상황에서 소켓 연결을 열고 사용하고 닫는 방법만 보여주었습니다. 즉, NNTP 서버에 연결하고 뉴스 그룹에서 일부 기사를 검색하는 것입니다. POST 명령을 사용하여 NNTP 서버에 기사를 게시하는 것은 그다지 복잡하지 않습니다.
따라서 다음 단계는 기사를 쉽게 저장하고 일부 검색 엔진(예: htgid, http://www.htdig.org/)을 사용하여 색인을 생성할 수 있는 뉴스 클라이언트를 작성하고 일부 Netscape를 제거하는 것입니다. 뉴스 그룹에서 키워드 검색을 수행할 수 있는 웹 애플리케이션입니다. 다음은 예입니다. http://www.phpindex.com/ng/를 방문하여 다운로드할 수 있습니다.