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

首頁 > 編程技術 > Php > 正文
php3:跨平台的服務器端嵌入式腳本語言(二)
BBS 水木清華站 bbs.net.tsinghua.edu.cn (2001-04-16 16:32:53)

        PHP3.0中的文件操作函數大體和C的類似,但有一些擴充,特別是除了支持 
對本機文件的訪問外,也支持對HTTP和FTP的URL進行訪問,只要把這些URL作為文件 
名傳遞給文件操作函數就可以了. 
        主要的文件操作函數有: 
        (1)fclose,feof,fgetc,fgets,fopen,fputs,fseek,ftell,mkdir,readlink, 
        rename,rewind,rmdir,stat,unlink 
                這些和C語言中的同名函數都差不多. 
        (2)chgrp,chmod,chown,copy 
                這些的意思也都應該容易理解: 
                chgrp(文件名,組); 
                chmod(文件名,模式); 
                chown(文件名,用戶); 
                copy(源文件名,目標文件名); 
                注意這些函數用的是文件名而不是fopen返回的文件號. 
        (3)file_exists,fileatime,filectime,filegroup,fileinode,filemtime, 
        fileowner,filesize,filetype,fileperms,fileumask,is_dir, 
        is_executable,is_file,is_link,is_readable,is_writeable 
                這些是文件信息函數,大多是接受一個文件名作為參數的. 
        (4)fgetss 
                用法: 
                        fgetss(文件號,最大長度); 
                讀取文件的一行或直到最大長度(類似fgets),但去掉所有的 
        HTML和PHP標記. 
        (5)file 
                用法: 
                        file(文件名); 
                返回一個數組,每一個元素是文件中的一行. 
        (6)tempnam 
                用法: 
                        tempnam(目錄名,前綴); 
                返回一個臨時文件名. 
        (7)basename,dirname 
                取得文件路徑中的文件名部分和目錄名部分. 
                在Windows系統下,"/"和"\"都可以作為目錄分割符,其他系統下只 
        有"/"可以. 
 
 

 
 
        PHP中的目錄遍歷功能本來也很普通,但它卻具有一種"面向對象"的形式, 
所以也提一下: 
        (1)dir,opendir 
                用法: 
                $d = dir("目錄名"); 
                $handle = opendir("目錄名"); 
                前者返回一個目錄對象,者返回一個目錄句柄. 
                前者返回的對象有handle和path兩個屬性,第一個就相當opendir 
        返回的句柄,第二個就是目錄名本身.訪問時用$d->handle和$d->path. 
        (2)read,readdir;rewind,rewinddir;close,closedir; 
                三組中每組的前一個是目錄對象的方法,用"對象->方法()"調用, 
        一個是函數,用"函數名(目錄句柄)"調用. 
                read是返回目錄中的下一個文件名. 
                rewind是回到目錄的第一個文件名. 
                close是關閉目錄,不再遍歷. 
        (3)chdir 
                轉換PHP的工作目錄. 
 
 
 
        PHP中的時間函數有這些: 
        (1)date 
                用法: 
                date(格式,[時間]); 
                如果沒有時間參數,則使用當前時間. 
                格式是一個字符串,其中以下字符有特殊意義: 
                U       替換成從一個起始時間(好象是1970年1月1日)以來的秒數 
                Y       替換成4位的年號. 
                y       替換成2位的年號. 
                F       替換成月份的英文全稱. 
                M       替換成月份的英文簡稱. 
                m       替換成月份數. 
                z       替換成從當年1月1日以來的天數. 
                d       替換成日數. 
                l       替換成星期幾的英文全稱. 
                D       替換成星期幾的英文簡稱. 
                w       替換成星期幾(數字). 
                H       替換成小時數(24小時制). 
                h       替換成小時數(12小時制).  
                i       替換成分鐘數. 
                s       替換成秒數. 
                A       替換成"AM"或"PM". 
                a       替換成"am"或"pm". 
                S       替換成序數字綴,例如:"st","nd","rd","th". 
                函數返回作過了替換的格式串. 
        (2)getdate(時間) 
                返回一個哈希表,各下標是: 
                "seconds"       --      秒數 
                "minutes"       --      分數 
                "hours"         --      小時數 
                "mday"          --      日數 
                "mon"           --      月份數 
                "year"          --      年號 
                "yday"          --      1月1日以來的天數 
                "weekday"       --      星期幾,英文全稱 
                "month"         --      月份,英文全名 
        (3)gmdate 
                與date類似,但先將時間轉換成格林威治標準時. 
        (4)mktime 
                用法: 
                mktime(小時數,分數,秒數,月,日,年); 
                返回一個時間值,可用其他函數. 
        (5)time 
                用法: 
                time(); 
                返回1970年1月1日零點以來的秒數. 
        (6)microtime 
                用法: 
                microtime(); 
                返回一個字符串,用空格分成兩部分,一部分相當time() 
        的返回值,前一部分是微秒數. 
        (7)checkdate 
                用法: 
                checkdate(月,日,年); 
                返回邏輯真或邏輯假. 
                如果: 
                [1]年在1900和32767之間(包括1900與32767); 
                [2]月在1到12之間; 
                [3]日在該月的允許日數范圍內(考慮了閏年); 
                則返回邏輯真. 
        (8)set_time_limit 
                用法: 
                set_time_limit(秒數); 
                規定從該句運行時起程序必須在指定秒數內運行結束, 
        超時則程序出錯退出.      
 
 
 
 
        PHP中有一組圖像函數,可以動態生成gif格式的圖像數據流並輸出到 
服務器. 
        為了這組函數能夠工作,系統中必須有gd庫的支持.如果是在Unix下, 
應該在編譯PHP之前先取得gd的源碼並編譯之,生成libgd.a和一些.h文件,分別 
拷到系統的庫目錄和頭文件目錄中(例如/usr/lib和/usr/include);如果是在 
Windows下,PHP3.0的安裝程序會安裝一個gd.dll文件,在程序中加一句'dl("gd. 
dll");'即可使用圖像函數. 
        主要的圖像函數有: 
        (1)ImageCreate(寬度,高度) 
        返回一個圖像描述符. 
        (2)ImageCreateFromGif(文件名); 
        返回一個圖像描述符. 
        (3)ImageColorAllocate(圖像描述符,紅,綠,藍); 
        返回一個顏色描述符.由Gif圖像只能有256色,必須先對它分配調色板, 
這個語句就是分配一個調色板項. 
        (4)ImageColorTransparent(圖像描述符,顏色描述符); 
        指定某顏色為透明色. 
        (5)ImageArc(圖像描述符,圓心橫坐標,圓心縱坐標,橢圓寬,橢圓高,起始 
角,終止角,顏色描述符); 
           ImageChar(圖像描述符,字體,x,y,字符,顏色描述符); 
           ImageCharUp(圖像描述符,字體,x,y,字符,顏色描述符); 
           ImageCopyResized(目標圖像描述符,源圖像描述符,目標x,目標y,源x,源y, 
目標寬,目標高,源寬,源高); 
           ImageDashedLine(圖像描述符,x1,y1,x2,y2,顏色描述符); 
           ImageFill(圖像描述符,起始點x,起始點y,顏色描述符); 
           ImageFilledPolygon(圖像描述符,各頂點數組,頂點數,顏色描述符); 
           ImageFilledRectangle(圖像描述符,x1,y1,x2,y2,顏色描述符); 
           ImageFillToBorder(圖像描述符,起始點x,起始點y,邊界色,填充色); 
           ImageLine(圖像描述符,x1,y1,x2,y2,顏色描述符); 
           ImagePolygon(圖像描述符,各頂點數組,頂點數,顏色描述符); 
           ImageRectangle(圖像描述符,x1,y1,x2,y2,顏色描述符); 
           ImageSetPixel(圖像描述符,x,y,顏色描述符); 
           ImageString(圖像描述符,字體,x,y,字符串,顏色描述符);  
           ImageStringUp(圖像描述符,字體,x,y,字符串,顏色描述符);  
           
        這些都是畫圖函數,需要略做解釋的就是多邊形的頂點數組內依次存放著 
第一點x,第一點y,第二點x,第二點y,... 
        (6)ImageLoadFont(文件名); 
        文件應該是一個位圖字體文件,返回一個字體號.系統缺省帶有1-5字體號, 
可以直接使用. 
        (7)ImageSX,ImageSY 
        分別得到一個圖像的寬度和高度,接收一個圖像描述符參數. 
        (8)ImageColorAt(圖像描述符,x,y); 
           ImageColorClosest(圖像描述符,紅,綠,藍); 
           ImageColorExact(圖像描述符,紅,綠,藍); 
           ImageColorSet(圖像描述符,顏色描述符,紅,綠,藍); 
           ImageColorsForIndex(圖像描述符,顏色描述符); 
           ImageColorsTotal(圖像描述符); 
        前三個返回一個顏色描述符.ImageColorExact如果找不到匹配則返回-1. 
        ImageColorsForIndex返回一個三項的數組,元素分別是紅,綠,藍值. 
        ImageColorsTotal返回總顏色數. 
        (9)ImageFontHeight,ImageFontWidth 
        接收一個字體號作為參數. 
        (10)ImageGif(圖像描述符,[文件名]); 
        如無文件名,則將gif數據流送往瀏覽器.這時程序一開始應該有一句: 
                Header("Content-type: image/gif")           
        (11)ImageDestroy(圖像描述符); 
 
        圖像函數中有一個小Bug(至少在PHP3.0RC和PHP3.0RC3 For Unix的源碼中 
已經發現,現在www.php.net上的下載文件應該已經更改),就是ImageSetPixel總是 
在(y,y)處畫點,不管x的值是什,不過這個問題不是很大. 
         
 
 
        PHP的數據庫功能應該說是它最有用的功能之一.它的特點就是內置了對很多 
數據庫的支持,而不再需要重新擴充. 
        Perl和Tcl也都是常用的跨平台語言,都有很強的字符能力,前者字符能力更 
強一些,性能更高一些;而者有GUI能力.它們都可以擴充以支持數據庫,但這時如果 
仍舊希望應用程序有跨平台能力,則需要在各種平台上各自擴充,比如在Unix平台上 
對Perl擴充DBI包,在Windows 95/NT下對Perl擴充Win32::ODBC包,有時候這是很麻煩 
的.而PHP由內置了數據庫支持,就為編程人員省去了這些麻煩. 
        PHP3.0支持以下數據庫: 
        Adabas_D,dBase,dbm,filePro,mSQL,MySQL,Sybase,Oracle,PostgreSQL,Solid 
        另外,支持Windows下的ODBC接口. 
        文檔中說如果需要使用Microsoft SQL Server,可以用Sybase接口或ODBC接口 
訪問. 
        在Unix下編譯時,應該在Configure時指定要帶哪些數據庫支持,系統中應該有 
這些數據庫的客戶程序(至少是頭文件和庫文件). 
        對各種數據庫,訪問函數並不完全相同,例如那些基SQL的數據庫顯然不能用 
和dBase或dbm相同的方式訪問.以下比較詳細地介紹幾種數據庫的訪問函數: 
        一.dBase 
        (1)dbase_create(文件名,域數組); 
        域數組的每一項又是一個數組,內容為該域的名稱,類型,長度和精度(兩項 
不一定要有). 
        域類型是一個字符,有這幾種值: 
        "L"--邏輯,"M"--備注,"D"--日期,"N"--數字,"C"--字符串 
        返回一個數據庫描述符,失敗則返回false. 
        (2)dbase_open(文件名,打開方式); 
        打開方式與C的open函數中的一樣. 
        返回一個數據庫描述符,失敗則返回false. 
        (3)dbase_numfields(數據庫描述符),dbase_numrecords(數據庫描述符); 
        (4)dbase_add_record(數據庫描述符,記錄); 
        記錄是一個數組.失敗則返回false. 
        (5)dbase_get_record(數據庫描述符,記錄號); 
        返回一個數組,下標從0開始.該數組如果用下標"deleted"訪問,可以得到 
該記錄是否已被刪除的信息. 
        (6)dbase_delete_record(數據庫描述符,記錄號); 
        (7)dbase_pack(數據庫描述符); 
        (8)dbase_close(數據庫描述符); 
 
 
        二,dbm 
        dbm是Unix下的一種非關系數據庫(至少我感覺是這樣),它實際上是文件形式 
的哈希表,每一對名字/值項稱為一個記錄. 
        dbm有好幾個版本,如ndbm,gdbm,等等. 
        (1)dbmopen(文件名,標志); 
        標志是"r"(只讀),"w"(可寫)或"n"(新建). 
        返回一個數據庫標識符. 
        (2)dbmfirstkey(數據庫標識符); 
        取得第一個名字(鍵),返回一個字符串. 
        (3)dbmnextkey(數據庫標識符,當前鍵); 
        返回下一個鍵. 
        (4)dbmexists(數據庫標識符,鍵); 
        確認該鍵是否存在,返回true/false. 
        (5)dbmfetch(數據庫標識符,鍵);  
        返回該鍵對應的值(字符串). 
        (6)dbminsert(數據庫標識符,鍵,值); 
        插入一個記錄,如指定鍵已存在則返回false,否則返回true. 
        (7)dbmreplace(數據庫標識符,鍵,值);  
        替換一個記錄,如原來沒有該記錄則插入. 
        (8)dbmdelete(數據庫標識符,鍵); 
        刪除一個記錄. 
        (9)dbmclose(數據庫標識符);  
 
 
 
        三,mSQL與MySQL. 
        mSQL(mini SQL)是一種小型的關系數據庫,性能不是太好,對SQL語言的 
支持也不夠完全,但在一些網絡數據庫應用中是足夠了. 
        MySQL是mSQL的一個變種,性能有所提高,增加了用戶訪問控制. 
        這兩種數據庫都是通過SQL語言訪問的,但MySQL基本支持全部SQL92規范, 
只是"select ... where select .."不支持,另外還擴充了一些數據類型,而mSQL 
則基本上不支持任何嵌套SQL語句,也不支持"update set column1=column1-1"這 
樣的語句. 
        mSQL由較簡單,在運行簡單的SQL語句時速度比MySQL略快,而MySQL在 
線程和索引上下了功夫,運行復雜的SQL語句時比mSQL,PostgreSQL,Oracle等都 
要快一些. 
        安全性方面,mSQL通過ACL文件設定各主機上各用戶的訪問權限,缺省是 
全部可讀/寫,而MySQL通過一個授權庫設定用戶名,口令和訪問權限,較可靠一些. 
        mSQL的存儲能力不是很清楚,MySQL的存儲能力受文件系統限制,例如在 
Linux下不能超過2G(3G?記不清楚了). 
        它們的好處就是都能免費得到並在Linux下安裝,不過如果用商業用途 
需要付費. 
        PostgreSQL也是Linux下的免費數據庫,RedHat5裡面就帶了,不過我沒有 
用過,就不說了. 
        mSQL與MySQL既然本來就是差不多的兩個東西,PHP中對它們的訪問語句也 
都差不多,例如msql_close與mysql_close就分別完成同樣的關閉動作.所以以下介紹 
時只對mysql介紹,msql的訪問語句只需換個前綴即可(特殊情況另行說明). 
注意:mSQL與MySQL訪問函數都需要有相應的權限才能運行. 
        (1)mysql_connect(主機,用戶名,口令); 
        返回一個連接號. 
        注意:mysql各用戶的口令可以隨該用戶所在機器IP地址不同而改變. 
        另外,mSQL沒有用戶名機制,所以msql_connect只需要一個主機參數. 
        主機可以是IP地址或域名. 
        (2)mysql_create_db(數據庫名); 
        (3)mysql_select_db(數據庫名,連接號); 
        連接一個數據庫. 
        (4)mysql_query(SQL語句,連接號); 
        如果SQL語句是select,則返回一個結果號.否則返回的值可以不理會. 
        如果失敗,返回false. 
        (5)mysql_fetch_array(結果號); 
        取出下一行,返回一個數組.可以用數字下標訪問(第一個字段是下標 
0),也可以用字符串下標訪問(即使用各字段名). 
        如已取了最一行,返回false. 
        (6)mysql_fetch_field(結果號,[字段序號]); 
        如無字段序號,取下一個字段. 
        返回一個哈希表,下標有: 
        name,table,max_length,not_null,primary_key,unique_key, 
        multiple_key,numeric,blob,type,unsigned,zerofill 
        各下標的意思應該比較明白了. 
        (7)mysql_num_rows(結果號);mysql_num_fields(結果號); 
        (8)mysql_free_result(結果號); 
        (9)mysql_list_dbs();mysql_list_tables(數據庫名); 
        (10)mysql_close(連接號); 
        (11)mysql_pconnect(主機,用戶名,口令); 
        與mysql_connect完全相似,但建立一個"永久連接",該連接一經建立永不關閉, 
即使使用mysql_close函數或程序執行完畢也不關閉.下一次試圖建立永久連接時,系統 
如發現已存在一個永久連接,則直接返回該連接號而不重新創建. 
 
        還有很多mSQL與MySQL函數,不一一介紹了. 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
php3:跨平台的服務器端嵌入式腳本語言(二) (2001-04-16 16:32:53)
php3:跨平台的服務器端嵌入式腳本語言(一) (2001-04-16 16:31:14)
 

★  樊強制作 歡迎分享  ★