[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Php > 正文
php3:跨平台的服務器端嵌入式腳本語言(一)
BBS 水木清華站 bbs.net.tsinghua.edu.cn (2001-04-16 16:31:14)
    服務器端腳本技術是一種非常有用的東西,將它和客戶端腳本技術聯合起來應用可以 
制作出功能極其強大的頁面。好象很久以前有一陣子哪個版(似乎是WWW版)上討論ASP 
到了熱火朝天的地步,還有人提議開個ASP版,那就是一種服務器端腳本技術。 
通常用的服務器端腳本技術是CGI,NSAPI/ISAPI/FastCGI等等都是對它的改善和擴展。 
至用什語言來實現CGI技術,沒有任何規定,大家一般使用Perl,因為它的字符 
功能比較強大。到了需要速度的場合,就用C來實現。  
用Perl/C等寫的CGI腳本是一種“非嵌入式”的服務器端腳本,因為它是一個單獨的程序, 
而不是嵌在HTML文檔中再通過另一個程序解釋替換。例如,下面的Perl程序: 
    print "Content-type:text/html\n\n"; 
    print <     
     
    Hello! 
     
     
    HeadofHTML 
    print "
aaa
"; 
    print ""; 
它中間雖然也有一段似乎是HTML文檔,但那是HTML文檔嵌入了Perl程序,而不是反過來。 
IDC/HTX,ASP等是嵌入式的服務器端腳本,下面的例子是一個mSQL Lite腳本: 
     
     
     
           echo "Hello!"; 
    > 
     
     
     
     
     
這個腳本經過服務器端的解釋程序,被替換成其輸出。 
PHP是一種跨平台的服務器端腳本技術。它最初是一個人為了寫他的主頁而用Perl寫 
的"包裝"程序,來因為用的人多了,就發展了起來,現在已經是3.0版,用C實現, 
在Unix和Windows 95/NT下都可以跑起來。 



   PHP3.0有幾個平台下的編譯好的版本,也有源碼版本。 
PHP3.0內部帶了對幾種常用數據庫的支持,包括:Sybase,Oracle,mSQL,mySQL,PostgresQL, 
ODBC,dBase等。如果編譯它的源碼時選擇對這些數據庫中某幾個的支持,那必須事先 
有它們的客戶庫。 
在Unix下編譯的方法是:先解壓,然運行"./configure [選項]"(選項見README文件), 
再運行"make"和"make install". 
選項中比較重要的有:"--enable-msql=msql庫路徑"等數據庫選項和"--enable-apache= 
apache源程序路徑"等。 
如果選擇了--enable-apache,那編譯出的將是一個庫文件,make install將把這個庫 
安裝到apache源程序中,然再編譯apache,可以得到支持php的apache服務器。否則, 
生成的將是一個解釋程序。 
具體請看README文件。 
在Windows下,有一個安裝程序,界面不太好,而且有幾個文件會報告找不到,跳過就是 
了。裝上要把php3目錄設成網絡可執行的。Readme中說要手工修改Registry,但似乎用 
不著。 
文檔不是太好,因為3.0的文檔還沒寫全,而2.0的文檔又有些過時了。 
安裝上之,系統應該支持對.php3和.phps文件的HTTP讀取了。(在Unix下需要修改服務 
器的srm.conf文件,具體看README). 
如果安裝時連進了apache服務器,那速度應該是最快的。如果作為CGI程序執行,速度 
也還將就。如果系統支持FastCGI,那解釋程序也可以作為FastCGI程序運行。Windows下 
支持ISAPI的解釋程序還沒有出來。


        現在我們來看看第一個php3腳本,照例是Hello,world. 
 
         
         
        First PHP3 Script 
         
         
        
 
                        echo "Hello, world!"; 
        ?> 
        
 
         
         
         
        把它放在任何一個能通過HTTP訪問到的目錄,取名hello.php3,再用瀏覽器連接 
該文件,就可以看見其效果了(不用我寫了吧.) 
        如果把它改名成hello.phps,再用Netscape或Explorer連接,可以看見加了顏色 
的源碼,因為解釋器在遇到.phps文件時會對它進行語法加亮的處理,在裡面加上很多顏色 
控制符再送出. 
        並不需要手工指定解釋器所在位置,因為如果在Apache服務器下,srm.conf裡面可以 
指定,在Microsoft IIS 或 PWS下,Registry裡面會指定. 
         
        從上面的例子應該很容易看出php3文件的寫法.用括起來的部分就是php3 
程序段,解釋器對其余部分不作處理,將這些程序段執行以其輸出代替(echo語句輸出一 
個無格式字符串,printf語句類似C的同名函數.) 
        同樣可以看出,php3程序雖然是文本,但客戶端只能看見解釋的結果(除非你提 
供同名的phps文件),因此對客戶端是保密的,這也是絕大部分服務器端腳本的特點. 


        PHP和一般的解釋性語言一樣,不需要事先定義變量.如果你試著使用一個 
沒有賦過值的變量,那返回的值是空字符串.對一個變量賦值則也就同時分配了 
這個變量的內存. 
        PHP的變量名前面必須有一個$號,這也是很多腳本語言的慣例了. 
        例如: 
                $a=1; 
                $b=1.0; 
                $c="Hello!"; 
        都是合法的PHP語句. 
        PHP中的數組是這樣定義的: 
                $a[1]="a"; 
                $a[2]="b"; 
        它會自動擴展,不必預先設定上限. 
        其實數組下標也可以是一個字符串,例如: 
                $a["a"]=1; 
                $a["b"]="Hello!"; 
        這時它實際上是一個哈希表,就象Tcl中的所謂數組一樣. 
        PHP中有一種類似指針的用法,例如: 
                $a = "b"; 
                $$a = "c"; 
        則一句產生了一個$b變量並給它賦值"c". 
        PHP變量之間的運算符和C的類似,例如也有: 
                +,-,*,/,%,^,&,|,&&,||,!,+=,-=,++,--等 
        PHP3.0定義了一個字符串相加運算符".",和Perl的一樣. 
        PHP的變量類型可以自動轉換,如果需要強制轉換,做法和C的一樣.它有Integer, 
Double,String三種簡單類型. 
        要遍歷一個哈希表,可以這樣: 
                        $i["a"] = 0; 
                        $i["c"] = 1; 
                        reset($i); 
                        for ($j=1;$j<=count($i);$j++) { 
                                $k = key($i); 
                                echo "$k, $i[$k]"; 
                                echo "
"; 
                                next($i); 
                        } 
        PHP中的控制流語句與C幾乎完全一樣,也有if...else,while,for,switch,break, 
exit. 
 
 

 
 
        PHP3.0中的函數如下例: 
        function test($a, $b) { 
                return $a*2+$b; 
        } 
        和C差不多. 
        函數可以遞歸調用. 
        PHP3.0的變量作用域規定也類似C,即缺省認為主程序中的變量是全局 
變量,而函數中的變量都是局部變量,即使有同名的全局變量也不使用. 
        如果在函數中要使用全局變量,則必須在函數頭上用global語句聲明, 
例如: 
        function ...{ 
                global $a, $b; 
                ... 
        } 
        如果函數頭上用static語句聲明了一些變量,那這些變量是靜態的,其 
含義與C語言中的相同. 
         
        PHP中提供include語句,類似C的#include. 
        include語句包含的可以是任意文件,它的內容將出現在最輸出的頁面 
上.如果該文件中有括起的部分,則該部分將被PHP解釋器解釋執行,否則 
該文件的內容原封不動地送出. 
        它包含的文件名可以是絕對或相對路徑,也可以是一個http或ftp的URL, 
在一種情況下,解釋器自動取來該URL內容.用這種方法甚至可以觸發一個別的 
機器上的CGI程序. 
        readfile語句類似include,但它不執行文件中的PHP程序,只把文件原 
封不動地送出.這時被包含的文件中的將被瀏覽器理解為注釋. 
 

 
        PHP3.0中的字符串操作功能是比較多的,重要的有以下這些: 
        (1)echo,print,printf,sprintf 
        前兩個函數是輸出字符串.字符串中如果有變量名則被替換成其值. 
        兩個函數類似C的同名函數. 
        (2)strchr,strlen,strtok,strrchr,strrev,strstr,strtolower, 
        strtoupper,substr,ucfirst 
        這些是常用的字符串操作函數,有些和C中的同名函數意義完全一致. 
        strrev是把一個字符串翻轉. 
        strtolower和strtoupper的意思應該不用解釋了. 
        ucfirst是把字符串的第一個字符變成大寫. 
        substr是返回字符串的一個子串,用法是:substr(字符串,頭,長度).頭位置是 
從0算起的.如果是負數,則是從尾部向前數的意思. 
        (3)Chr,Ord 
        類似C的同名函數. 
        (4)explode,implode,join 
        這些是和數組有關的函數. 
        explode(字符串,分割符)返回一個將字符串在分割符處分開所產生的數組. 
        implode(數組,分割符)返回一個將數組各元素之間插上分割符而成的字符串. 
        join與implode意義相同. 
        (5)Chop 
        去掉字符串尾部的空白. 
        (6)htmlspecialchars 
        將字符串中的HTML特殊字符換成它們的名字,例如"<"變成"<". 
        (7)nl2br 
        在字符串中的每一個回車前面加上"
". 
        (8)AddSlashes,StripSlashes 
        分別給字符串中需要加上"\"才能用數據庫查詢的字符加上和去掉"\".  
        (9)parse_str 
        將"name1=value1&name2=value2&..."類型的字符串分析成一些變量. 
        例如: 
                parse_str("a=1&b=2"); 
        生成$a與$b兩個變量,值分別為1,2. 
        如果有兩對名字/值的名字部分相同,則一個的值覆蓋前一個的. 
        如果這兩對的名字尾部都有"[]",例如"a[]=1&a[]=2",則生成數組$a,兩個元素 
分別為1,2. 

 
        PHP與其它跨平台語言(也許Java不在其列. :))類似,也有正規表達式功能. 
        PHP3.0的正規表達式功能當然遠遠比不上Perl,但還是足夠用的,主要函數 
有這些: 
        (1)ereg,eregi 
        這是正規表達式匹配函數,前者是大小寫有關匹配,者則是無關的. 
        用法: 
                ereg(正規表達式,字符串,[匹配部分數組名]); 
        PHP3.0中的正規表達式大體類似grep中用的. 
        (2)ereg_replace,eregi_replace 
        這些是替換函數. 
        用法: 
                ereg_replace(正規表達式,替換串,原字符串); 
        字符串處理函數中有一個strtr,是"翻譯"函數,類似Perl中的tr/.../.../, 
用法: 
                strtr(字符串,"從","到"); 
        例如: 
                strtr("aaabb","ab","cd")返回"cccdd". 
        (3)split 
        與explode函數有些類似,但這次可以在匹配某正規表達式的地方分割字符串. 
        用法: 
                split(正規表達式,字符串,[取出前多少項]); 
          (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
 

★  樊強制作 歡迎分享  ★