HTTP 筆記與總結(9)分塊傳輸、持久連接 與 反向 ajax(comet / server push / 服務器推技術)

HTTP 筆記與總結(9)分塊傳輸、持久連接 與 反向 ajax(comet / server push / 服務器推技術)

反向 ajax 又叫 comet / server push / 服務器推技術php

應用範圍:網頁聊天服務器,例如新浪微博在線聊天、google mail 網頁聊天html

原理:通常而言,HTTP 協議的特色是,鏈接以後斷開鏈接(服務器響應 Content-Length,收到了指定 Length 長度的內容時,也就斷開了)。在 HTTP 1.1 協議中,容許不寫 Content-Length,好比要發送的內容長度確實不知道,此時須要一個特殊的 Content-Type:chunked,叫作分塊傳輸,只有當服務器最後發送 0\r\n,在代表服務器和客戶端的這次鏈接完全結束。mysql

 

【例】ajax

1sql

2數據庫

3瀏覽器

4服務器

5fetch

6google

7

8

9

10

11

12

13

14

15

16

<?php

set_time_limit(0);

//ob_start();

$pad str_repeat(' ', 4000);

echo $pad,'<br />';

ob_flush();

flush();//把產生的內容當即發送給瀏覽器而不是等腳本結束再一塊兒發送

 

$i = 1;

while($i++){

    echo $pad,'<br>';

    echo $i,'<br>';

    ob_flush();

    flush();

    sleep(1);

}

執行頁面:

  

 2,3,4,5..源源不斷地輸出。

 

 

當輸出的值是數據庫中的數據(能夠是聊天記錄),就能夠實現即時通訊。 

新建數據庫 msg,新建表 message:

1

2

3

4

5

6

CREATE TABLE `message` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `content` varchar(200) NOT NULL COMMENT '聊天內容',

  `flag` int(11) NOT NULL DEFAULT '0' COMMENT '0-未讀 1-已讀',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

修改 comet.php: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?php

set_time_limit(0);

//ob_start();

$pad str_repeat(' ', 4000);

echo $pad,'<br />';

ob_flush();

flush();//把產生的內容當即發送給瀏覽器而不是等腳本結束再一塊兒發送

 

//鏈接數據庫

$conn = mysql_connect('localhost''root''');

mysql_query('use msg');

 

while(1){

    $sql 'select * from message where flag = 0';

    $rs = mysql_query($sql$conn);

    $row = mysql_fetch_assoc($rs);

    if(!empty($row)){

        echo $pad,'<br />';

        echo $row['content'],'<br />';

        mysql_query('update message set flag = 1');

    }

 

    ob_flush();

    flush();

    sleep(1);

}

 

同時在命令行中運行 mysql,插入數據:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

C:\Users\Administrator>D:

 

D:\>cd wamp/bin/mysql/mysql5.5.20/bin

 

D:\wamp\bin\mysql\mysql5.5.20\bin>mysql -uroot -p

Enter password:

Welcome to the MySQL monitor.  Commands end with or \g.

Your MySQL connection id is 15

Server version: 5.5.20-log MySQL Community Server (GPL)

 

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql> use msg

Database changed

mysql> insert into message values (1,'hello',0);

Query OK, 1 row affected (0.03 sec)

 

mysql> insert into message values (2,'world',0);

Query OK, 1 row affected (0.00 sec)

 

mysql>

 

此時頁面的效果是:每插入一條數據,該數據就在頁面中當即輸出

  

該技術就叫 comet / server push / 反向 ajax 技術。

  

能夠使用 Node.js(長鏈接)+Redis(隊列服務器)+ PHP + comet(反向 ajax) 實現更好的即時聊天。

相關文章
相關標籤/搜索