linux創建shell腳本,linux 腳本中的push,在Linux系統下實現ServerPush(轉)

 2023-10-20 阅读 22 评论 0

摘要:在Linux系統下實現ServerPush(轉)[@more@]  由于Linux的開放性,極大激發了程序員的創造力,使得以Linux為作業平臺的新技術不斷出現。Server Push(推技術)就是其中一例。它可在完全不增加成本的基礎上,使網站達到最佳的性能。本文將對其進行詳細

在Linux系統下實現ServerPush(轉)[@more@]  由于Linux的開放性,極大激發了程序員的創造力,使得以Linux為作業平臺的新技術不斷出現。Server Push(推技術)就是其中一例。它可在完全不增加成本的基礎上,使網站達到最佳的性能。本文將對其進行詳細介紹。

一、環境配置

linux創建shell腳本、為了在Linux下更充分領略Server Push的功能,在運行環境上,我們需進行一些選擇。

1.WWW服務器

首先要在Linux上安裝Apache,以便能自由編譯功能模塊,這樣可以充分使用Server Push、FastCGI、EPerl和PHP等新的擴展功能。

shell腳本基本命令,2.腳本支持

筆者推薦用Perl或C語言來寫CGI腳本,因為Perl已經是CGI腳本程序事實上的標準。而且在Perl 5中已經可以直接調用 C子程序而不需要任何聲明。不管你用什么語言來寫CGI腳本,解釋器中應該有CGI.PM模塊,筆者試用的版本是 5.004,這一模塊的更新版大家可以從網上下載。

二、程序實例及函數剖析

docker push unauthorized、好了,有了上面的工具,下面我們就來寫一個Server Push程序來說明它的實現過程:

#!/usr/bin/perl

use CGI qw/:push -nph/;

在linux中?$| = 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/,如需轉載,請注明出處,否則將追究法律責任。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/152036.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息