HTTP 긴 연결의 '서버 푸시' 기술을 기반으로 한 PHP 단순 대화방

PHPz
풀어 주다: 2019-02-12 11:47:51
원래의
1102명이 탐색했습니다.

HTTP 긴 연결에 대한 "서버 푸시"의 기술적 원리에 대해서는 IBM에서 제공하는 기사를 확인하실 수 있습니다.

첫 번째는 텍스트 입력이 포함된 홈페이지입니다. 채팅 콘텐츠 표시 iframe에는 양식을 제출하는 데 사용되는 숨겨진 iframe도 있습니다.

코드는 다음과 같습니다.

<?php
//chat.php
header(&#39;cache-control: private&#39;);
header(&#39;Content-Type: text/html; charset=utf-8&#39;);
?>
<html>
<script type="text/javascript">
function submitChat(obj) {
obj.submit();
document.getElementsByName(&#39;content&#39;)[0].value = &#39;&#39;;
}
</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[&#39;content&#39;]);
if ($content) {
$fp = fopen(&#39;./chat.txt&#39;, &#39;a&#39;);
fwrite($fp, $content . "\n");
fclose($fp);
clearstatcache();
}
?>
로그인 후 복사

다음으로 기본 HTTP를 살펴보세요. chat_content.php 파일인 긴 연결 부분:

코드는 다음과 같습니다.

<?php
header(&#39;cache-control: private&#39;);
header(&#39;Content-Type: text/html; charset=utf-8&#39;);
//测试设置30秒超时,一般会设置比较长时间。
set_time_limit(30);
//这一行是为了搞定IE这个BT
echo str_repeat(&#39; &#39;, 256);
ob_flush();
flush();
$fp = new SplFileObject(&#39;./chat.txt&#39;, &#39;r+&#39;);
$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 &#39;<div>&#39;;
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 연결을 닫습니다.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿