php3:跨平台的伺服器端嵌入式腳本語言(2)

火星人 @ 2014-03-12 , reply:0


   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系統下,"/"和"\"都可以作為目錄分割符,其他系統下只
有"/"可以.


標 題: php3:跨平台的伺服器端嵌入式腳本語言(9)


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的工作目錄.



標 題: php3:跨平台的伺服器端嵌入式腳本語言(10)


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(秒數);
規定從該句運行時起程序必須在指定秒數內運行結束,
超時則程序出錯退出.



標 題: php3:跨平台的伺服器端嵌入式腳本語言(11)


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的值是什麼,不過這個問題不是很大.



標 題: php3:跨平台的伺服器端嵌入式腳本語言(12)


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(資料庫描述符);


標 題: php3:跨平台的伺服器端嵌入式腳本語言(13)


二,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(資料庫標識符);

標 題: php3:跨平台的伺服器端嵌入式腳本語言(14)


三,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函數,不一一介紹了





[火星人 via ] php3:跨平台的伺服器端嵌入式腳本語言(2)已經有510次圍觀

http://www.coctec.com/docs/program/show-post-72483.html