天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

基于HTTP長連接的"服務器推"技術的php 簡易聊天室

首先是首頁,包含一個文本輸入和一個顯示聊天內容的iframe,還有一個隱藏iframe用來提交form表單:
復制代碼 代碼如下:
<?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長連接只能打開兩個,由于瀏覽器的限制。另外其實即使你設置了一個永不超時,其實上服務器部分(如Apache)的配置文件也可能對HTTP請求設置了最長等待時間,所以也可能效果會不是你想的,一般默認可能都是15分鐘超時。如果有興趣可以自己嘗試修改。
  09. 這里輸出了一段空白,主要是手冊上已經說明了,IE瀏覽器在前面256個字符是不會直接輸出的,所以我們先隨便輸出些空白,以便讓后面的內容輸出來,可能其他瀏覽器也有其他瀏覽器的設置,具體可以查看php手冊的frush函數的說明。接下去11、12行就是強制把這些空白符丟給瀏覽器輸出。
  13. ~ 20. 這里主要是為了計算文件行數,以便從這一行后面開始讀內容。
  接下去的while循環就是一個死循環了,就是循環輸出文件內容,每次判斷是否到達文件末尾,如果有用戶寫入文件,則當前檢測肯定不是文件末尾,就將該行讀取出來輸出,否則將指針往前移動一行,繼續循環,每次等待1000微秒,
  39. 如果一直保持長連接,那么即使客戶端斷開,服務端也不一定能知道客戶端已經斷開,所以這里可能還需要做一些心跳記錄,比如每個用戶保持一個心跳flag,每格幾秒更新一下最后心跳時間,當檢測最后時間很久沒更新后,推出這個死循環,關閉這個HTTP連接。
  OK,基本上原理就是這樣了,當然這個性能不清楚,有興趣的自己試試,歡迎交流。

php技術基于HTTP長連接的&amp;quot;服務器推&amp;quot;技術的php 簡易聊天室,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品第十页 | 色狠狠一区二区 | 欧美AAAAAA级午夜福利视频 | 国产区在线不卡视频观看 | 一区二区三区无码高清视频 | 中文字幕在线观看亚洲日韩 | 亚洲AV噜噜狠狠网址蜜桃尤物 | 在线观看成年人免费视频 | 免费在线亚洲视频 | 东北真实仑乱 | 四虎视频最新视频在线观看 | 少妇厨房愉情理9伦片视频 少妇被躁爽到高潮无码久久 | 国产成年人在线观看 | 亚洲AV无码乱码A片无码蜜桃 | 播色屋97超碰在人人 | 乌克兰10一12x video| 在线天天看片视频免费观看 | 纯肉腐文高H总受男男 | 色综合伊人色综合网站中国 | 国产69精品久久久久妇女 | 欧美丰满熟妇BBB久久久 | 无人区日本电影在线观看 | 青青视频 在线 在线播放 | 亚洲精品第一页 | 青青草 久久久 | 三级黄在线播放 | 性一交一无一伦一精一品 | 日日啪在线影院百度 | 亚洲精品国产AV成人毛片 | 国产精品18久久久久网站 | 久久精品午夜一区二区福利 | 国产午夜精AV在线麻豆 | 亚洲精品成人无码区一在线观看 | 亚洲国产AV一区二区三区四区 | 国产乱国产乱老熟300部视频 | 忘忧草在线影院WWW日本动漫 | 麻豆国产人妻精品无码AV | 久久高清免费视频 | 国产午夜亚洲精品理论片八戒 | 亚洲午夜精品一区二区公牛电影院 | 好爽别插了无码视频 |