亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于HTTP長(zhǎng)連接的"服務(wù)器推"技術(shù)的php 簡(jiǎn)易聊天室

 更新時(shí)間:2009年10月31日 00:19:16   作者:  
關(guān)于HTTP長(zhǎng)連接的“服務(wù)器推”技術(shù)原理可以查看IBM的這篇文章,我簡(jiǎn)單的做了個(gè)DEMO.
首先是首頁(yè),包含一個(gè)文本輸入和一個(gè)顯示聊天內(nèi)容的iframe,還有一個(gè)隱藏iframe用來(lái)提交form表單:
復(fù)制代碼 代碼如下:

<?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>

另外一個(gè)就是保存用戶提交的聊天內(nèi)容了,我簡(jiǎn)單的寫一下文本,而且沒(méi)有做什么鎖定,這個(gè)只是簡(jiǎn)易版本:
復(fù)制代碼 代碼如下:

<?php
$content = trim($_POST['content']);
if ($content) {
$fp = fopen('./chat.txt', 'a');
fwrite($fp, $content . "\n");
fclose($fp);
clearstatcache();
}
?>

  接下來(lái)看主要的HTTP長(zhǎng)連接部分,也就是chat_content.php文件:
復(fù)制代碼 代碼如下:

<?php
header('cache-control: private');
header('Content-Type: text/html; charset=utf-8');
//測(cè)試設(shè)置30秒超時(shí),一般會(huì)設(shè)置比較長(zhǎng)時(shí)間。
set_time_limit(30);
//這一行是為了搞定IE這個(gè)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();
}
{
//這里可以添加心跳檢測(cè)后退出循環(huán)
}
usleep(1000);
}
?>

  我一行行解釋一下,其實(shí)也比較容易理解:
  06. 設(shè)置一個(gè)超時(shí)時(shí)間,由于要保持HTTP長(zhǎng)連接,這個(gè)時(shí)間肯定要比較長(zhǎng),可能要幾個(gè)小時(shí)吧,上面提到的文章里也有說(shuō)明,這種HTTP長(zhǎng)連接只能打開兩個(gè),由于瀏覽器的限制。另外其實(shí)即使你設(shè)置了一個(gè)永不超時(shí),其實(shí)上服務(wù)器部分(如Apache)的配置文件也可能對(duì)HTTP請(qǐng)求設(shè)置了最長(zhǎng)等待時(shí)間,所以也可能效果會(huì)不是你想的,一般默認(rèn)可能都是15分鐘超時(shí)。如果有興趣可以自己嘗試修改。
  09. 這里輸出了一段空白,主要是手冊(cè)上已經(jīng)說(shuō)明了,IE瀏覽器在前面256個(gè)字符是不會(huì)直接輸出的,所以我們先隨便輸出些空白,以便讓后面的內(nèi)容輸出來(lái),可能其他瀏覽器也有其他瀏覽器的設(shè)置,具體可以查看PHP手冊(cè)的frush函數(shù)的說(shuō)明。接下去11、12行就是強(qiáng)制把這些空白符丟給瀏覽器輸出。
  13. ~ 20. 這里主要是為了計(jì)算文件行數(shù),以便從這一行后面開始讀內(nèi)容。
  接下去的while循環(huán)就是一個(gè)死循環(huán)了,就是循環(huán)輸出文件內(nèi)容,每次判斷是否到達(dá)文件末尾,如果有用戶寫入文件,則當(dāng)前檢測(cè)肯定不是文件末尾,就將該行讀取出來(lái)輸出,否則將指針往前移動(dòng)一行,繼續(xù)循環(huán),每次等待1000微秒,
  39. 如果一直保持長(zhǎng)連接,那么即使客戶端斷開,服務(wù)端也不一定能知道客戶端已經(jīng)斷開,所以這里可能還需要做一些心跳記錄,比如每個(gè)用戶保持一個(gè)心跳flag,每格幾秒更新一下最后心跳時(shí)間,當(dāng)檢測(cè)最后時(shí)間很久沒(méi)更新后,推出這個(gè)死循環(huán),關(guān)閉這個(gè)HTTP連接。
  OK,基本上原理就是這樣了,當(dāng)然這個(gè)性能不清楚,有興趣的自己試試,歡迎交流。

相關(guān)文章

  • 淺析PHP微信支付通知的處理方式

    淺析PHP微信支付通知的處理方式

    本文是對(duì)上篇文章的一個(gè)補(bǔ)充,主要是官方?jīng)]有關(guān)于通知的demo,摸石頭過(guò)河真的很難受,方便大家開發(fā),放出來(lái)給大家看看
    2014-05-05
  • Yii2實(shí)現(xiàn)跨mysql數(shù)據(jù)庫(kù)關(guān)聯(lián)查詢排序功能代碼

    Yii2實(shí)現(xiàn)跨mysql數(shù)據(jù)庫(kù)關(guān)聯(lián)查詢排序功能代碼

    本篇文章主要介紹了Yii2實(shí)現(xiàn)跨mysql數(shù)據(jù)庫(kù)關(guān)聯(lián)查詢排序功能示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • xss防御之php利用httponly防xss攻擊

    xss防御之php利用httponly防xss攻擊

    這篇文章主要介紹了xss防御之php利用httponly防xss攻擊,下面是PHP設(shè)置HttpOnly的方法,需要的朋友可以參考下
    2014-03-03
  • Zend Framework入門教程之Zend_Config組件用法詳解

    Zend Framework入門教程之Zend_Config組件用法詳解

    這篇文章主要介紹了Zend Framework入門教程之Zend_Config組件用法,結(jié)合實(shí)例形式分析了Zend_Config組件針對(duì)各種類型配置文件操作的相關(guān)技巧,需要的朋友可以參考下
    2016-12-12
  • php操作memcache緩存方法分享

    php操作memcache緩存方法分享

    一般來(lái)說(shuō),如果并發(fā)量不大的情況,使不使用緩存技術(shù)并沒(méi)有什么影響,但如果高并發(fā)的情況,使用緩存技術(shù)就顯得很重要了,可以很好的減輕數(shù)據(jù)庫(kù)和服務(wù)器的壓力,當(dāng)然解決高并發(fā)的技術(shù)有很多,這里只是以緩存的角度來(lái)說(shuō)明使用memcache的便捷性和方便性,
    2015-06-06
  • php框架CodeIgniter使用redis的方法分析

    php框架CodeIgniter使用redis的方法分析

    這篇文章主要介紹了php框架CodeIgniter使用redis的方法,結(jié)合實(shí)例形式分析了redis的安裝、設(shè)置及CodeIgniter使用redis的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • smarty中改進(jìn)truncate使其支持中文的方法

    smarty中改進(jìn)truncate使其支持中文的方法

    這篇文章主要介紹了smarty中改進(jìn)truncate使其支持中文的方法,涉及針對(duì)Smarty源碼中truncate源文件進(jìn)行函數(shù)功能擴(kuò)展的相關(guān)技巧,需要的朋友可以參考下
    2016-05-05
  • thinkPHP5框架分頁(yè)樣式類完整示例

    thinkPHP5框架分頁(yè)樣式類完整示例

    這篇文章主要介紹了thinkPHP5框架分頁(yè)樣式類,結(jié)合完整實(shí)例形式分析了thinkPHP5帶css樣式控制的分頁(yè)類定義與簡(jiǎn)單使用方法,需要的朋友可以參考下
    2018-09-09
  • ThinkPhP5整合微信小程序訂閱消息實(shí)用代碼

    ThinkPhP5整合微信小程序訂閱消息實(shí)用代碼

    記錄一下開發(fā)小程序消息推送的實(shí)例,配合后端tp推送,要使用微信訂閱通知功能,需要用戶首先在小程序點(diǎn)擊訂閱后,后臺(tái)方可推送相關(guān)訂閱通知模板,否則無(wú)法直接推送
    2023-08-08
  • PHP圖片裁剪函數(shù)(保持圖像不變形)

    PHP圖片裁剪函數(shù)(保持圖像不變形)

    這篇文章主要介紹了PHP圖片裁剪函數(shù),同時(shí)保持圖像不變形,需要的朋友可以參考下
    2014-05-05

最新評(píng)論