在Linux系統下實現ServerPush(轉)
在Linux系統下實現ServerPush(轉)[@more@] 由於Linux的開放性,極大激發了程式設計師的創造力,使得以Linux為作業平臺的新技術不斷出現。Server Push(推技術)就是其中一例。它可在完全不增加成本的基礎上,使網站達到最佳的效能。本文將對其進行詳細介紹。
一、環境配置
為了在Linux下更充分領略Server Push的功能,在執行環境上,我們需進行一些選擇。
1.WWW伺服器
首先要在Linux上安裝Apache,以便能自由編譯功能模組,這樣可以充分使用Server Push、FastCGI、EPerl和PHP等新的擴充套件功能。
2.指令碼支援
筆者推薦用Perl或C語言來寫CGI指令碼,因為Perl已經是CGI指令碼程式事實上的標準。而且在Perl 5中已經可以直接呼叫 C子程式而不需要任何宣告。不管你用什麼語言來寫CGI指令碼,直譯器中應該有CGI.PM模組,筆者試用的版本是 5.004,這一模組的更新版大家可以從網上下載。
二、程式例項及函式剖析
好了,有了上面的工具,下面我們就來寫一個Server Push程式來說明它的實現過程:
#!/usr/bin/perl
use CGI qw/:push -nph/;
$| = 1;
print multipart—init(-boundary=〉′--boundary′);
while (1) {
print multipart—start(-type=〉′text/plain′),
″The current time is ″,scalar(localtime),″ ″,
multipart—end;
sleep 1;
}
程式第二行告訴CGI解釋程式來呼叫支援Server Push 的功能模組(CGI.PM),在這個模組中預先定義了三個函式:multipart—init()、multipart—start()和multipart—end,只要在程式中有use CGI qw/:push -nph/宣告,就可以直接使用這三個函式。
multipart—init()函式的作用是宣告一個文件型別,就像普通的CGI程式中的“Content-Type: text/html”宣告,告訴伺服器下面傳送的是HTML文件,而multipart—init()這一函式宣告的檔案型別卻是實現Server Push最根本的方法型別:
Content-Type: multipart/x-mixed-replace; boundary=′--boundary′
如果你對HTTP的MIME型別有詳細的瞭解,你就知道multipart 型別是一種複合型別,它的子型別是mixed,子型別的X引數,大家可以參看詳細的MIME型別說明,這裡最關鍵的是replace方法,它不停地用新接收的資料更新舊的資料,這就是 Server Push最大的技術內涵。boundary只是一個邊界值,告訴瀏覽器從這兒開始,使用Server Push方法了。其實你完全可以這樣理解,只要在指令碼程式中宣告瞭如multipart/x-mixed-replace 這樣一個文件型別,伺服器就和客戶機建立了一個特別的連線。伺服器就不斷地把客戶機請求的資料來源源不斷地推向了客戶機。而傳統的 Client PULL方法則是:
1.Client 和Server建立連線
2.Client傳送請求到Server
3.Server響應請求
4.Server 斷開連線以響應下一請求。
透過這兩種方法的比較,大家可以看出Server Push優點主要在於伺服器和客戶機之間這種不間斷的連線方式,使它不需要採用Client PULL的〈META http-equiv=refresh content=″n″〉這種方法來重新整理頁面,不僅更新速度快,而且不會產生閃動效果。
如果你不用multipart—init()而直接在指令碼程式中用以下語句也可以達到同樣目的:print ″Content-Type: multipart/x-mixed-replace; boundary=′boundary′ ″。當系統不支援multipart—init()函式時,就可以直接這樣宣告。
multipart—start() 這個函式是為伺服器指定了傳送一個確定的文件,如果不用這個函式,根據指令碼程式的內容伺服器可以直接把指定資料傳送給客戶機,當然客戶機不能識別這種型別的文件可以忽略而不會產生錯誤。但如果你指明瞭具體的文件型別,如例程中的text/plain(純文字型別),客戶機就不再對文件加以分析,從而提高了處理速度,否則客戶機只知道傳送過來的是 multipart(複合型)而要重新對其分析。
至於multipart—end函式不需作詳細說明,只是說明了一個 Push過程的結束。
為了使大家能更好地理解這三個函式詳細的技術內容,筆者把這三個函式的實現過程介紹給大家:
sub multipart—init {
my($self,@p) = self—or—default(@—);
my($boundary,@other) = $self-〉rearrange([BOUNDARY],@p);
$boundary = $boundary || ′------- =—aaaaaaaaaa0′;
$self-〉{′separator′} = ″ --$boundary ″;
$type = Server—Push($boundary);
return $self-〉header(
-nph =〉 1,
-type =〉 $type,
(map { split ″=″, $—, 2 } @other),
) . $self-〉multipart—end;
}
sub multipart—start {
my($self,@p) = self—or—default(@—);
my($type,@other) = $self-〉rearrange([TYPE],@p);
$type = $type || ′text/html′;
return $self-〉header(
-type =〉 $type,
(map { split ″=″, $—, 2 } @other),
);
}
sub multipart—end {
my($self,@p) = self—or—default(@—);
return $self-〉{′separator′};
}
三、應用技巧
使用Server Push的其它技巧,限於篇幅,筆者不再作過多的介紹。不過有時由於客戶機在一段時間內沒有對伺服器發生請求,也就是若一段時間內沒有新的內容向瀏覽器輸入,可能發生連線超時現象,用下面的程式來處理一下就能很好地解決:
$message=1;
$whilecount=1;
do {
主程式;
$message++;
}
if ($whilecount == 30)
{
print ″〈SCRIPT〉$message〈/SCRIPT〉1512″;
$whilecount = 0;
}
$whilecount++;
sleep 1;
這種技巧大家一看就明白了,正如很多 FTP軟體的Loop一樣,在空閒時發一個空訊號,不讓程式進入等待狀態。這段程式每過30秒就給客戶機輸出一行〈SCRIPT〉$message〈/SCRIPT〉,而$message是數值1、2、3等,這一行在瀏覽器瀏覽時並不顯示任何內容,讓瀏覽者感覺不到。
一、環境配置
為了在Linux下更充分領略Server Push的功能,在執行環境上,我們需進行一些選擇。
1.WWW伺服器
首先要在Linux上安裝Apache,以便能自由編譯功能模組,這樣可以充分使用Server Push、FastCGI、EPerl和PHP等新的擴充套件功能。
2.指令碼支援
筆者推薦用Perl或C語言來寫CGI指令碼,因為Perl已經是CGI指令碼程式事實上的標準。而且在Perl 5中已經可以直接呼叫 C子程式而不需要任何宣告。不管你用什麼語言來寫CGI指令碼,直譯器中應該有CGI.PM模組,筆者試用的版本是 5.004,這一模組的更新版大家可以從網上下載。
二、程式例項及函式剖析
好了,有了上面的工具,下面我們就來寫一個Server Push程式來說明它的實現過程:
#!/usr/bin/perl
use CGI qw/:push -nph/;
$| = 1;
print multipart—init(-boundary=〉′--boundary′);
while (1) {
print multipart—start(-type=〉′text/plain′),
″The current time is ″,scalar(localtime),″ ″,
multipart—end;
sleep 1;
}
程式第二行告訴CGI解釋程式來呼叫支援Server Push 的功能模組(CGI.PM),在這個模組中預先定義了三個函式:multipart—init()、multipart—start()和multipart—end,只要在程式中有use CGI qw/:push -nph/宣告,就可以直接使用這三個函式。
multipart—init()函式的作用是宣告一個文件型別,就像普通的CGI程式中的“Content-Type: text/html”宣告,告訴伺服器下面傳送的是HTML文件,而multipart—init()這一函式宣告的檔案型別卻是實現Server Push最根本的方法型別:
Content-Type: multipart/x-mixed-replace; boundary=′--boundary′
如果你對HTTP的MIME型別有詳細的瞭解,你就知道multipart 型別是一種複合型別,它的子型別是mixed,子型別的X引數,大家可以參看詳細的MIME型別說明,這裡最關鍵的是replace方法,它不停地用新接收的資料更新舊的資料,這就是 Server Push最大的技術內涵。boundary只是一個邊界值,告訴瀏覽器從這兒開始,使用Server Push方法了。其實你完全可以這樣理解,只要在指令碼程式中宣告瞭如multipart/x-mixed-replace 這樣一個文件型別,伺服器就和客戶機建立了一個特別的連線。伺服器就不斷地把客戶機請求的資料來源源不斷地推向了客戶機。而傳統的 Client PULL方法則是:
1.Client 和Server建立連線
2.Client傳送請求到Server
3.Server響應請求
4.Server 斷開連線以響應下一請求。
透過這兩種方法的比較,大家可以看出Server Push優點主要在於伺服器和客戶機之間這種不間斷的連線方式,使它不需要採用Client PULL的〈META http-equiv=refresh content=″n″〉這種方法來重新整理頁面,不僅更新速度快,而且不會產生閃動效果。
如果你不用multipart—init()而直接在指令碼程式中用以下語句也可以達到同樣目的:print ″Content-Type: multipart/x-mixed-replace; boundary=′boundary′ ″。當系統不支援multipart—init()函式時,就可以直接這樣宣告。
multipart—start() 這個函式是為伺服器指定了傳送一個確定的文件,如果不用這個函式,根據指令碼程式的內容伺服器可以直接把指定資料傳送給客戶機,當然客戶機不能識別這種型別的文件可以忽略而不會產生錯誤。但如果你指明瞭具體的文件型別,如例程中的text/plain(純文字型別),客戶機就不再對文件加以分析,從而提高了處理速度,否則客戶機只知道傳送過來的是 multipart(複合型)而要重新對其分析。
至於multipart—end函式不需作詳細說明,只是說明了一個 Push過程的結束。
為了使大家能更好地理解這三個函式詳細的技術內容,筆者把這三個函式的實現過程介紹給大家:
sub multipart—init {
my($self,@p) = self—or—default(@—);
my($boundary,@other) = $self-〉rearrange([BOUNDARY],@p);
$boundary = $boundary || ′------- =—aaaaaaaaaa0′;
$self-〉{′separator′} = ″ --$boundary ″;
$type = Server—Push($boundary);
return $self-〉header(
-nph =〉 1,
-type =〉 $type,
(map { split ″=″, $—, 2 } @other),
) . $self-〉multipart—end;
}
sub multipart—start {
my($self,@p) = self—or—default(@—);
my($type,@other) = $self-〉rearrange([TYPE],@p);
$type = $type || ′text/html′;
return $self-〉header(
-type =〉 $type,
(map { split ″=″, $—, 2 } @other),
);
}
sub multipart—end {
my($self,@p) = self—or—default(@—);
return $self-〉{′separator′};
}
三、應用技巧
使用Server Push的其它技巧,限於篇幅,筆者不再作過多的介紹。不過有時由於客戶機在一段時間內沒有對伺服器發生請求,也就是若一段時間內沒有新的內容向瀏覽器輸入,可能發生連線超時現象,用下面的程式來處理一下就能很好地解決:
$message=1;
$whilecount=1;
do {
主程式;
$message++;
}
if ($whilecount == 30)
{
print ″〈SCRIPT〉$message〈/SCRIPT〉1512″;
$whilecount = 0;
}
$whilecount++;
sleep 1;
這種技巧大家一看就明白了,正如很多 FTP軟體的Loop一樣,在空閒時發一個空訊號,不讓程式進入等待狀態。這段程式每過30秒就給客戶機輸出一行〈SCRIPT〉$message〈/SCRIPT〉,而$message是數值1、2、3等,這一行在瀏覽器瀏覽時並不顯示任何內容,讓瀏覽者感覺不到。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-948700/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在Linux中,如何實現檔案系統的快照和克隆?Linux
- 【Linux】Linux系統實現回收站功能Linux
- Linux檔案系統的實現Linux
- linux下安裝 openoffice 實現 office文件轉 pdfLinux
- 在Linux系統下製作U盤啟動盤Linux
- Linux下玩轉nginx系列(五)---nginx實現負載均衡LinuxNginx負載
- Linux下玩轉nginx系列(七)---nginx如何實現限流功能LinuxNginx
- Linux系統管理命令二(轉)Linux
- 深入理解Linux作業系統下的守護程式(轉)Linux作業系統
- 在linux下搭建NFS伺服器實現檔案共享LinuxNFS伺服器
- Linux系統呼叫詳解(實現機制分析)Linux
- WSL2:我在原生的Win10玩轉Linux系統Win10Linux
- 在Linux系統下如何建立定時任務?操作介紹!Linux
- 用C語言在Linux系統下建立守護程式(Daemon)C語言Linux
- Linux系統下網路配置Linux
- VirtualBox下安裝Linux系統Linux
- Linux系統下活用History命令Linux
- linux系統下svn常用指令Linux
- 在Unity中實現2D光照系統Unity
- 10分鐘實現dotnet程式在linux下的自動部署Linux
- Windows 系統,PHP實現PPT轉PDF,PDF轉圖片的操作WindowsPHP
- Linux下玩轉nginx系列(六)---nginx實現cache(快取)服務LinuxNginx快取
- 深度剖析 Linux 夥伴系統的設計與實現Linux
- Bash 實現 Linux 版 sysinfo 獲取系統資訊Linux
- polipo/privoxy 實現 Linux 系統全域性/自動代理Linux
- linux下軟raid的實現LinuxAI
- 在 Linux 系統中開放埠Linux
- RUST 在linux 系統的安裝RustLinux
- Linux系統下的HDD Rootkit分析Linux
- 作業系統 Linux下的程式作業系統Linux
- 【轉載】SAP 系統中STO+VC 技術實現
- 微軟在Linux 作業系統中發現了兩個漏洞微軟Linux作業系統
- 在Linux系統下啟動eclipse時遇到Eclipse 無法正常啟動LinuxEclipse
- Linux下使用supervisor實現程式管理Linux
- 在Linux系統中部署NodeJS專案LinuxNodeJS
- 在Linux系統上部署test環境Linux
- 教你玩轉Linux—系統目錄結構Linux
- Linux 檢視設定系統語言(轉)Linux
- 作業系統中檔案系統的實現和分配方式探析(下)作業系統