HTTP 긴 연결에 대한 "서버 푸시"의 기술적 원리에 대해서는 IBM에서 제공하는 기사를 확인하실 수 있습니다.
첫 번째는 텍스트 입력이 포함된 홈페이지입니다. 채팅 콘텐츠 표시 iframe에는 양식을 제출하는 데 사용되는 숨겨진 iframe도 있습니다.
코드는 다음과 같습니다.
<?php //chat.php header('cache-control: private'); header('Content-Type: text/html; charset=utf-8'); ?> <html> <script type="text/javascript"> function submitChat(obj) { obj.submit(); document.getElementsByName('content')[0].value = ''; } </script> <iframe src="./chat_content.php" height="300" width="100%"></iframe> <iframe name="say" height="0" width="0"></iframe> <form method="POST" target="say" action="./say.php" onsubmit="submitChat(this)"> <input type="text" size="30" name="content" /> <input type="button" value="say" onclick="submitChat(this.form)" /> </form> </html>
다른 하나는 제출한 채팅 콘텐츠를 저장하는 것입니다. 사용자는 텍스트만 작성하고 잠금은 없습니다. 이것은 단순한 버전입니다.
코드는 다음과 같습니다.
<?php $content = trim($_POST['content']); if ($content) { $fp = fopen('./chat.txt', 'a'); fwrite($fp, $content . "\n"); fclose($fp); clearstatcache(); } ?>
다음으로 기본 HTTP를 살펴보세요. chat_content.php 파일인 긴 연결 부분:
코드는 다음과 같습니다.
<?php header('cache-control: private'); header('Content-Type: text/html; charset=utf-8'); //测试设置30秒超时,一般会设置比较长时间。 set_time_limit(30); //这一行是为了搞定IE这个BT echo str_repeat(' ', 256); ob_flush(); flush(); $fp = new SplFileObject('./chat.txt', 'r+'); $line = 0; $totalLine = 0; while (!$fp->eof()) { $fp->current(); $totalLine++; $fp->next(); } $fp->seek($totalLine); $i = $totalLine - 1; while (true) { if (!$fp->eof()) { if ($content = trim($fp->current())) { echo '<div>'; echo htmlspecialchars($content); echo "</div>"; flush(); $fp->next(); $i++; } } else { $fp->seek($i - 1); $fp->next(); } { //这里可以添加心跳检测后退出循环 } usleep(1000); } ?>
한줄씩 설명드리는데 실제로 보시면 더 이해하기 쉽습니다. 🎜>
06. 긴 HTTP 연결을 유지해야 하므로 이 시간을 비교해야 합니다. 위에서 언급한 기사에서는 이러한 긴 HTTP 연결 중 2개만 열 수 있다고 설명합니다. 브라우저 제한으로 인해. 또한, Never Timeout을 설정하더라도 서버 부분(예: Apache)의 구성 파일에서 HTTP 요청에 대한 최대 대기 시간을 설정할 수도 있으므로 효과는 일반적으로 기본값이 아닐 수 있습니다. 15분의 시간 초과. 관심이 있으시면 직접 수정해 보시기 바랍니다. 09. 여기서는 공백 부분이 출력되는데, 이는 주로 설명서에서 IE 브라우저가 처음 256자를 직접 출력하지 않는다고 설명했기 때문에 이후 내용을 쉽게 출력할 수 있도록 먼저 공백을 출력합니다. , 다른 브라우저에도 다른 브라우저에 대한 설정이 있을 수 있습니다. 자세한 내용은 PHP 매뉴얼에서 Frush 기능에 대한 설명을 확인하세요. 다음 11줄과 12줄은 이러한 공백 문자가 브라우저에 의해 출력되도록 강제하는 것입니다. 13. ~ 20. 여기서 주요 목적은 이 줄의 끝부터 내용을 읽을 수 있도록 파일 줄 수를 계산하는 것입니다. 다음 while 루프는 파일 내용을 루프로 출력하는 무한 루프이며, 사용자가 파일에 쓸 때마다 파일의 끝에 도달하는지 여부를 확인합니다. 파일의 끝이 아니므로 해당 줄은 다음과 같습니다. 출력을 읽고, 그렇지 않으면 포인터를 한 줄 앞으로 이동하고, 계속해서 반복하고, 매번 1000마이크로초를 기다립니다. 39.긴 연결이 유지되는 경우에도 마찬가지입니다. 클라이언트 연결이 끊어지면 서버는 클라이언트 연결이 끊어졌다는 사실을 알고 여기에서 일부 하트비트 기록을 수행해야 할 수 있습니다. 예를 들어 각 사용자는 하트비트 플래그를 유지하고 몇 초마다 마지막 하트비트 시간을 업데이트합니다. 마지막 시간이 감지되고 오랫동안 업데이트되지 않은 경우 이 HTTP 연결을 닫습니다.