全球超過300萬個互聯網網站的管理員都在使用php,使得它成為最為普及的服務器端腳本語言之一。其特點是運行速度快、穩定可靠、跨平臺,而且是開放源代碼軟件。隨你使用的水平不同,php可以很簡單,也可以很復雜,可以只使用它發送html表格元素,還可以在php應用程序中集成java和xml。
如果你對php有一定的了解或者看過一些初步的教材,這些技巧可以擴展你對php的認識,使你掌握一些常見的和高級的php功能。
一、把php安裝為apache的dso
php在linux/unix平臺上經常與apache搭配使用,在安裝php時,有三種安裝方式可供選擇:靜態模式、動態模式(dso)、cgi二進制模式。
由于易于維護和升級,我強烈建議以dso方式安裝php。例如,初次安裝時如果安裝的php僅支持數據庫,隨后希望再安裝支持加密的模塊,只要運行“make clean”,添加新的配置選項,然后再運行“make”和“make install”即可,一個新的php模塊就會安裝在apache中適當的位置上,然后重新啟動apache,而無需重新編譯apache。
下面的步驟將安裝一個全新的apache,并以dso方式安裝php:
1、從apache軟件基金會得到最新版本的apache源代碼;
2、把得到的源代碼放到/usr/local/或者/opt/目錄下,或者你指定的任意目錄中;
3、運行gunzip對文件進行解壓縮,得到后綴為.tar的文件;
4、運行下面的命令,把文件安裝到apache_[version]目錄中:
tar -xvf apache_[version].tar
5、進入/usr/local/apache_[version]目錄(或者在步驟4中安裝壓縮文件的目錄);
6、鍵入下面的命令為編譯apache作準備,用你自己的路徑替換其中的[path],例如,/usr/local/apache[version],現在已經設置了mod_so的新值,它將允許apache使用dso模塊;
7、回到提示符狀態后鍵入make,并等待再次回到提示符狀態;
8、執行“make install”命令。
至此,apache已經安裝完畢,系統將重回到提示符狀態。接下來我們開始安裝php:
1、在php主頁的下載區中找到最新版本的鏈接;
2、把文件下載到一個適當的目錄中,例如/usr/local/或/opt/或者你指定的任意目錄中;
3、運行gunzip對文件進行解壓縮,得到后綴為.tar的文件;
4、執行下面的命令把文件安裝在php-[version]目錄中:
tar -xvf php-[version]
5、進入/usr/local/php-[version]目錄或在步驟4中指定的目錄;
至此,已經作好了以dso方式安裝php的準備工作,唯一需要修改的配置選項是with-apxs(這是apache的bin目錄中的一個文件)。為了得到較高的性能,我沒有安裝對mysql的支持模塊。
./configure --with-mysql=/[path to mysql] --with-apxs=/[path to apxs]
6、回到提示符狀態后執行make命令,等待重新返回到提示符狀態;
7、執行make install命令。
至此,系統以dso方式在apache的模塊目錄中安裝了php,并對apache的httpd.conf文件作適當的修改后返回到提示符狀態。回到提示符狀態后,你還需要對apache的httpd.conf文件作一些修改。
1、找到包含有serveradmin的一行,添加你的電子郵件地址,如下所示:
serveradmin [email protected]
2、找到以servername開頭的行,把它改為真正的值,例如:
servername localhost
3、找到內容如下所示的小節:
# and for php 4.x, use:
#
#addtype application/x-httpd-php .php
#addtype application/x-httpd-php-source .phps
修改這些行的內容,使php 4.0的addtype不再成為注釋,并添加希望在php中使用的文件后綴名,上面的內容變為如下所示的內容:
# and for php 4.x, use:
#
addtype application/x-httpd-php .php .phtml
addtype application/x-httpd-php-source .phps
保存文件,回到上一級目錄,執行下面的命令重新啟動apache:
./bin/apachectl start
如果在啟動時沒有出現錯誤提示信息,就可以通過創建一個名為phpinfo.php的只有如下所示一行內容的文件,對安裝的apache、php進行測試:
<? phpinfo() ?>
把這個文件保存到apache的文檔根目錄(htdocs)中,然后開啟瀏覽器,鍵入http://localhost/phpinfo.php地址,屏幕上就會出現許多的變量和它們的值。
如果要重新配置php,需要再次運行make clean命令,然后執行帶有一系列選項的./configure命令,然后再執行make和 make install命令,apache的目錄模塊中就會出現一個新的模塊,只要再重新啟動apache加載這個新的模塊,就一切ok了。
二、使用php本身的對話
php 4.0中最令人期待的特性應該是對對話的支持,php 3.0的用戶必須使用第三方的軟件否則就不能使用對話,不支持對話一直是php最大的缺憾之一。
只要用戶在瀏覽你的網站,你就可以利用對話維護與特定用戶有關的變量,而無需建立多個cookie、使用隱藏表格字段或將信息存儲在數據庫中。
在一個網頁上啟動一個對話,就會使php引擎知道你想啟動一個對話(如果還沒有啟動)或者繼續當前的對話:
session_start();
啟動一個對話將通過cookie向用戶發送一個識別字符串(例如940f8b05a40d5119c030c9c7745aead9),在服務器端,會創建一個與識別字符串匹配的臨時文件,例如sess_940f8b05a40d5119c030c9c7745aead9,這個文件中包含注冊的對話變量以及它們的值。
用來顯示對話的作用的最常見的例子是訪問計數器。啟動php模塊,確保php代碼是文件的第一行,在php代碼之前不要有空格、html代碼和其他的代碼。因為對話會發送一個頭部,因此如果在session_start()之前有空格和html代碼,就會得到一個出錯信息。
<?
// 如果還不存在一個針對某用戶的用戶,則啟動一個對話:
session_start();
然后注冊一個名字為count的變量:
session_register('count');
注冊一個對話變量后,只要對話存在,名字為count的變量也就存在。現在,count變量還沒有被賦值,如果對它執行加1操作,它的值就變為了1。
$count++;
把上述內容綜合在一塊兒,如果還沒有啟動一個對話,就會啟動一個對話;如果不存在一個對話id,就為用戶指定一個好了,注冊一個名字為$count的變量,對$count執行加1操作表示用戶已經首次訪問了該網頁。
要知道用戶在當前的對話中訪問本頁面的次數,只要顯示$count變量的值即可:
echo "<p>you've been here $count times.</p>";
全部的訪問計數器代碼如下所示:
<?
session_start();
session_register('count');
$count++;
echo "<p>you've been here $count times.</p>";
?>
如果重新加載上述的腳本文件,就會發現變量count的值增加了1,很酷吧。
還可以在對話中注冊一個數組變量,假設我們注冊了一個名字為$faves的變量:
$faves = array ('chocolate','coffee','beer','linux');
可以象注冊一個簡單變量那樣注冊一個數組變量:
session_register('faves');
引用數組變量與引用簡單變量沒有什么二樣,如果一個用戶在網頁上指出在生活中的愛好時,可以把他的愛好注冊到一個被稱作$faves的數組變量中,然后可以在另一個網頁中很方便地把這些愛好顯示出來:
<?
session_start();
echo "my user likes:
<ul>";
while (list(,$v) = each ($faves)) {
echo "<li>$v"; }
echo "</ul>";
?>
然后你就得到了一個關于用戶愛好的清單。
對話變量不能被查詢字符串覆蓋,也就是說我們不能輸入http:///www.yourdomain.com/yourscript.php?count=56給注冊變量$count指定一個新值,這一點對于安全很重要:只能在服務器端的腳本中刪除一個沒有注冊的對話變量。
如果要完全刪除一個對話變量,首先需要從系統中注銷它:
session_unregister('count');
要完全刪除一個對話變量的腳本是非常簡單,如下所示:
session_destroy();
使用對話變量可以減少訪問數據庫的頻率,使代碼更加清晰,而且可以減少對用戶發送的cookie的數量,它是最簡單的方法了。
三、文件是我們的朋友
無論你在開發的網站規模的大小,都應該意識到代碼重用的重要性,無論這些代碼是html、還是php代碼。例如,你必須至少每年改變一次包含版權信息的頁腳,如果你的網站含有1000個頁面,每年修改一次也是個很煩人的事兒。
在php中,至少有幾個函數可以幫助你實現代碼重用的目的,所使用的函數取決于你所重用的代碼,主要的函數有:
* include() and include_once()
* require() and require_once()
include()函數包含并對給定的文件進行計算,例如:
include('/home/me/myfile');
在include文件中的任何代碼都在include()出現的代碼范圍內執行,你可以通過聯合使用include()和fopen()在自己的服務器上包含靜態文件,在另一臺服務器上包含目標文件。
include_once()的功能與include()相同,二者之間的區別在于它會檢查一個文件中的代碼是否已經包含在現有的腳本中,如果代碼已經存在,則不會再次包含它。
require()函數用給定文件的內容取代它本身,這一代替過程發生在php引擎編譯代碼期間,而不是在執行期間進行,它不象include()那樣會首先進行計算。require()函數更多地用在靜態元素中,而include()更多地用于動態元素中。與include_once()類似的是, require_once()將首先檢查是否已經插入給定的代碼,如果代碼已經存在,就不再插入了。
為也了解其內容,在版權信息、靜態文字和其他不包含變量的元素或者依賴其他正在執行的腳本的元素中我更趨向于使用require函數。例如:
<html>
<head><title>VeVb.com</title></head>
<body>
[a lot of content]
<?
// insert copyright
require('/home/me/mycopyright');
?>
</body>
</html>
另一方面,我經常在文件的開始使用include()來控制許多的函數:
<?
//得到函數庫
include('/home/me/myfunctions');
// do php things with my functions ?>
<html>
<head><title>VeVb.com</title></head>
<body>
[a lot of content]
</body>
</html>
下一個問題就該是“include和require文件在哪里?”,對這個問題簡單的回答是,“系統中的任意地方。”如果你的代碼中包含有帶有用戶名和口令的數據庫連接,你肯定不會將它們都放在文檔根目錄中向所有的人都開放。
included或required文件可以在系統上的任何地方,只要php運行的系統上的用戶可以訪問這些文件即可,你可以使這些文件具有任何后綴,或者不使用后綴。
使用include()和require()對在網站中的元素進行具體化是一種普遍的現象,并在需要對網站升級時,給你帶來很大的方便。
四、php和文件系統的維護
php中有許多與文件系統有關的函數,這些函數不僅可以打開文件,還可以顯示目錄中的內容、移動文件和其他一些功能,許多人甚至用php開發基于互聯網的文件資源管理器。
關于文件路徑的解釋:在windows中,可以在路徑中使用/和/符號,而在其他的操作系統中只能使用/符號。出于一致性的緣故,我們統一使用/符號。
下面的腳本樣例可以顯示一個目錄清單,注釋已經包含在代碼中:
<? /*把要讀取的目錄的全路徑名存入一個名字為$dir_name的變量中。 */
$dir_name = "/home/me/";
/* 創建一個句柄,其值是打開一個給定目錄的結果*/
$dir = opendir($dir_name);
/* 建立一個文字塊,用以放置列表元素(文件名字)*/
$file_list = "<ul>";
/* 使用一個while語句,讀取已經打開的目錄中的所有元素,如果文件的名字不是“.”或“..”,則顯示列表中的名字*/
while ($file_name = readdir($dir)) {
if (($file_name != ".") && ($file_name != "..")) {
$file_list .= "<li>$file_name";
}
}
$file_list .= "</ul>";
/*關閉打開的目錄,結束php模塊*/
closedir($dir);
?>
<!-- start your html -->
<html>
<head>
<title>directory listing</title>
</head>
<body>
<!-- use php to print the name of the directory you read -->
<p>files in: <? echo "$dir_name"; ?></p>
<!-- use php to print the directory listing -->
<? echo "$file_list"; ?>
</body>
</html>
好了,我們已經得到了一個目錄清單。需要注意的是,要讀取一個文件(稍后我們將進行講解)或目錄的內容,php運行的系統上的用戶必須至少有讀取文件的權限。
下面是一個如何拷貝文件的例子:
<? /*把你要拷貝的原文件的全路徑賦給一個名字為$original的變量中,把拷貝的文件的全路徑賦予一個名字為$copied的變量中*/
$original = "/home/me/mydatabasedump";
$copied = "/archive/mydatabasedumo_1010";
/* 使用copy()函數拷貝原始文件,如果拷貝沒有完成則會顯示一個錯誤信息*/
@copy($original, $copied) or die("couldn't copy file.");
?>
這個例子是一個文件備份系統的原型。在這段腳本運行時,它把文件拷貝到一個不同的位置進行保存。稍微修改一下守護程序,就可以在一天中你指定的時刻執行它,而無需用戶的干預。
假定你在系統上安裝了lynx,可以創建一個守護程序的條目訪問這個文件,訪問這個文件會運行這個腳本并建立一個拷貝文件,下面的例子將在上午5點鐘運行這個腳本,然后關閉lynx:
0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1
如果運行的是cgi版本的php,可以跳過lynx部分,而直接調用二進制文件:
0 5 * * * [username] php /path/to/copyfile.php 1>/dev/null 2>&1
五、豐富的數組函數
php 4.0中新添加了30個與組數有關的函數,其中一些常見的函數可以判斷一個數組中是否包含某個元素,對一個數組中的元素進行計數,添加或刪除數組中的元素或者對數組中的元素進行排序。
如果有一個很大的數組,而你需要找出其中是否包含一個特定的元素,就可以使用in_array()。下面的例子將顯示 “not found in this array”,因為在一個名字為$namesarray的數組中查找albert,而在$namesarray數組中不存在這樣一個元素。
<? $namesarray = array("joe", "jane", "bob", "mary", "paul", "eddie", "john");
$lookingfor = "albert";
if (in_array($lookingfor, $namesarray)) {
echo "you've found it!";
} else {
echo "not found in this array!";
}
?>
如果把$lookingfor的值改為mary,就會得到“you've found it!”的信息,因為mary是$namesarray數組中的一個元素。
如果要對一個數組中的元素個數進行計數,只要簡單地使用count()函數即可:
<? $namesarray = array("joe", "jane", "bob", "mary", "paul", "eddie", "john");
$count = count($namesarray); ?>
返回的$count的值為7。
可以在一個數組的開頭或結尾處添加元素,還可以使用array_merge()來建立一個包含二個或更多數組中元素的新數組,合并時,元素的順序會按指定的順序排列,如果原來的數組是被排過序的,在合并后需要對它重新排序。
我們可以首先利用array_push()在數組的結尾處添加一個元素:
<? /* 建立一個數組 */
$fruitarray = array("apple", "orange", "banana", "kiwi", "pear");
/* 向數組中添加元素 */
array_push($fruitarray, "grape", "pineapple", "tomato");
/*顯示每個元素及其序號*/
while (list($key,$value) = each($fruitarray)) {
echo "$key : $value<br>";
}
?>
運行上面的程序將得到下面的結果:
0 : apple
1 : orange
2 : banana
3 : kiwi
4 : pear
5 : grape
6 : pineapple
7 : tomato
如果需要在數組的開頭添加元素,其代碼與上面的代碼差不多,唯一的不同之處是需要用array_unshift()代替array_push()。
<?
/* 建立一個數組*/
$fruitarray = array("apple", "orange", "banana", "kiwi", "pear");
/* 向數組中添加元素*/
array_unshift($fruitarray, "grape", "pineapple", "tomato");
/* 顯示每個元素及其序號*/
while (list($key,$value) = each($fruitarray)) {
echo "$key : $value<br>";
}
?>
運行上面的程序將得到下面的結果:
0 : grape
1 : pineapple
2 : tomato
3 : apple
4 : orange
5 : banana
6 : kiwi
7 : pear
array_merge()函數可以把二個或更多的數組合并為一個數組。
<? /*建立第一個數組*/
$fruitarray = array("apple", "orange", "banana", "kiwi", "pear");
/*/建立第二個數組*/
$vegarray = array("carrot", "green beans", "asparagus", "artichoke", "corn");
/*把這二個數組合并為一個數組*/
$goodfoodarray = array_merge($fruitarray, $vegarray);
/* 顯示每個元素及其序號*/
while (list($key,$value) = each($goodfoodarray)) {
echo "$key : $value<br>";
}
?>
運行上面的腳本將得到下面的結果:
0 : apple
1 : orange
2 : banana
3 : kiwi
4 : pear
5 : carrot
6 : green beans
7 : asparagus
8 : artichoke
9 : corn
現在我們已經掌握了如何添加元素和合并數組,我們再來看看如何從一個數組中刪除元素。從一個數組的末尾刪除一個元素可以使用array_pop()函數,使用array_shift()函數可以從一個數組的開頭刪除一個元素。盡管使用array_pop()或 array_shift()從數組中刪除了一個元素,你還可以把這個元素當作一個變量來使用。
使用array_pop()從一個數組的末尾刪除一個元素:
<?
/*建立一個數組*/
$fruitarray = array("apple", "orange", "banana", "kiwi", "pear");
/* 從數組的末尾刪除一個元素*/
$popped = array_pop($fruitarray);
/* 顯示刪除后數組的內容和你刪除的元素*/
while (list($key,$value) = each($fruitarray)) {
echo "$key : $value<br>";
}
echo "<br>and finally, in $popped: $popped";
?>
運行上面的腳本會得到下面的結果:
0 : apple
1 : orange
2 : banana
3 : kiwi
and finally, in $popped: pear
我們再來討論一個從一個數組的末尾刪除元素的例子:
<?
/* 建立一個數組*/
$fruitarray = array("apple", "orange", "banana", "kiwi", "pear");
/*從一個數組的開始刪除一個元素*/
$shifted = array_shift($fruitarray);
/* 顯示刪除后數組的內容和你刪除的元素*/
while (list($key,$value) = each($fruitarray)) {
echo "$key : $value<br>";
}
echo "<br>and finally, in $shifted: $shifted";
?>
運行上述腳本會得到如下的顯示結果:
0 : orange
1 : banana
2 : kiwi
3 : pear
and finally, in $shifted: apple
另外還有幾個函數可以對數組中的元素進行排序,但在這里我們將只簡要介紹基本的排序函數,說明排序的過程:
<? /*建立一個數組*/
$fruitarray = array("apple", "orange", "banana", "kiwi", "pear");
/* 對數組進行排序*/
sort($fruitarray);
/*顯示每個元素及其序號*/
while (list($key,$value) = each($fruitarray)) {
echo "$key : $value<br>";
}
?>
運行上述的腳本會得到如下的顯示結果:
0 : apple
1 : banana
2 : kiwi
3 : orange
4 : pear
六、動態圖像的創建
只要安裝一些第三方的庫文件并具有一定的幾何知識,就可以利用php來創建和處理圖像了。事實上,這不需要太多的幾何知識,因為我大學沒有畢業,仍然可以利用php創建圖像。
在使用基本的圖像創建函數之前,需要安裝gd庫文件。如果要使用與jpeg有關的圖像創建函數,還需要安裝jpeg-6b,如果要在圖像中使用type 1型字體,則必須安裝t1lib。
在建立圖像創建環境之前,還需要作一些準備工作。首先,安裝t1lib;其次安裝jpeg-6b,然后再安裝gd庫文件。在安裝時一定要按這里給定的順序進行安裝,因為在編譯gd為庫時會用到jpeg-6b,如果沒有安裝jpeg-6b,在編譯時就會出錯。
在安裝完這三個組件后,還需要重新配置php,這也是你對采用dso方式安裝php感到慶幸的地方之一。運行make clean,然后在當前的配置中添加下面的內容:
--with-gd=[/path/to/gd]
--with-jpeg-dir=[/path/to/jpeg-6b]
--with-t1lib=[/path/to/t1lib]
完成添加后執行make命令,然后再執行make install命令。重新啟動apache后運行phpinfo()來檢查一下新的設置是否生效了。現在就可以開始圖像創建工作了。
根據所安裝的gd庫文件的版本不同,你也許能或者不能創建gif或png格式的圖形文件,如果安裝的是gd-1.6或以前的版本,可以使用gif格式的文件但不能創建png格式,如果安裝的是gd-1.6以后的版本,可以創建png文件但不能創建gif格式的文件。
創建一幅簡單的圖像也需要用到許多的函數,我們將一步一步地進行說明。
在這個例子中,我們將創建一個png格式的圖像文件,下面的代碼是一個包含所創建的圖像的mime類型的頭部:
<? header ("content-type: image/png");
使用imagecreate()創建一個代表空白圖像的變量,這個函數要求以像素為單位的圖像大小的參數,其格式是imagecreate(x_size, y_size)。如果要創建一個大小為250x250的圖像,就可以使用下面的語句:
$newimg = imagecreate(250,250);
由于圖像還是空白的,因此你可能會希望用一些彩色來填充它。然而,你需要首先使用imagecolorallocate()函數用其rgb值為這種顏色指定一個名字,這一函數的格式為imagecolorallocate([image], [red], [green], [blue])。如果要定義天藍色,可以使用如下的語句:
$skyblue = imagecolorallocate($newimg,136,193,255);
接下來,需要使用imagefill()函數用這種顏色填充這個圖像,imagefill()函數有幾個版本,例如 imagefillrectangle()、imagefillpolygon()等。為簡單起見,我們通過如下的格式使用imagefill()函數:
imagefill([image], [start x point], [start y point], [color])
imagefill($newimg,0,0,$skyblue);
最后,建立圖像后釋放圖像句柄和所占用的內存:
imagepng($newimg);
imagedestroy($newimg); ?>
這樣,創建圖像的全部代碼如下所示:
<? header ("content-type: image/png");
$newimg = imagecreate(250,250);
$skyblue = imagecolorallocate($newimg,136,193,255);
imagefill($newimg,0,0,$skyblue);
imagepng($newimg);
imagedestroy($newimg);
?>
如果把這個腳本文件保存為skyblue.php,并用瀏覽器訪問它,就會看到一個天藍色的250x250的png格式的圖像。
我們還可以使用圖像創建函數對圖像進行處理,例如把一個較大圖像作成一個小圖像:
假設你有一幅圖像,想從中裁剪出一個35x35大小的圖像。你所需要作的是創建一個35x35大小的空白圖像,創建一個包含原來圖像的圖像流,然后把一個經過調整大小的原來的圖像放到新的空白圖像中。
要完成這一任務的關健函數是imagecopyresized(),它要求的格式如下所示:imagecopyresized ([new image handle],[original image handle],[new image x], [new image y], [original image x], [original image y], [new image x], [new image y], [original image x], [original image y])。
<? /* 發送一個頭部,以便讓瀏覽器知道該文件所包含的內容類型*/
header("content-type: image/png");
/* 建立保存新圖像高度和寬度的變量*/
$newwidth = 35;
$newheight = 35;
/* 建立給定高度和寬度的新的空白圖像*/
$newimg = imagecreate($newwidth,$newheight);
/* 從原來較大的圖像中得到數據*/
$origimg = imagecreatefrompng("test.png");
/*拷貝調整大小后的圖像,使用imagesx()、imagesy()得到原來的圖像在x、y方面上的大小 */ imagecopyresized($newimg,$origimg,0,0,0,0,$newwidth,$newheight,imagesx($origimg),imagesy($origimg));
/*創建希望得到的圖像,釋放內存 */
imagepng($newimg);
imagedestroy($newimg); ?>
如果把這一小段腳本保存為resized.php,然后用瀏覽器對它進行訪問,就會看到一個35x35大小的png格式的圖形。
七、基于php的用戶認證
如果希望在每一段腳本上都進行口令保護,可以結合使用header()語句、$php_auth_user和$php_auth_pw來建立基本的認證方案,通常的基于服務器的提問/響應順序都如下所示:
1、用戶從服務器上請求一個文件。如果這個文件在服務器上是被保護的,則在響應的頭部向用戶返回一個401(示經授權的用戶)字符串。
2、瀏覽器收到這個響應后,彈出要求用戶輸入用戶名/口令的對話框。
3、用戶在對話框中輸入一個用戶名和口令,點擊ok按鈕將信息返回服務器供認證使用。
4、如果用戶名和口令有效,被保護的文件將向用戶開放,只要用戶還在使用文件,認證會一直有效。
一段簡單的php腳本文件通過向用戶發送一個適當的能夠引起自動顯示用戶名/口令對話框的http頭部就可以模仿http的提問/響應系統,php把用戶在用戶名/口令對話框中輸入的信息存儲在$php_auth_user和$php_auth_pw中,使用這二個變量,就可以與存儲在文本文件、數據庫等文件中的用戶名/口令進行比較。
這個例子采用了二個硬編碼的值進行認證,但無論用戶名和口令放在什么地方,其原理都是相同的。
<?
/* 檢查$php_auth_user和$php_auth_pw中的值*/
if ((!isset($php_auth_user)) || (!isset($php_auth_pw))) {
/* 如果沒有值,則發送一個能夠引發對話框出現的頭部*/
header('www-authenticate: basic realm="my private stuff"');
header('http/1.0 401 unauthorized');
echo 'authorization required.';
exit;
} else if ((isset($php_auth_user)) && (isset($php_auth_pw))){
/* 變量中有值,檢查它們是否正確*/
if (($php_auth_user != "validname") || ($php_auth_pw != "goodpassword")) {
/* 如果輸入的用戶名和口令中有一個不正確,則發送一個能夠引發對話框出現的頭部 */
header('www-authenticate: basic realm="my private stuff"');
header('http/1.0 401 unauthorized');
echo 'authorization required.';
exit;
} else if (($php_auth_user == "validname") || ($php_auth_pw == "goodpassword")) {
/* 如果二個值都正確,顯示成功的信息 */
echo "<p>you're authorized!</p>";
}
}
?>
需要注意的是,如果你使用的是基于文件的保護機制,它并不能保證目錄中所有的文件的安全。它可能保護大部分的文件,如果你認為它能夠保護給定目錄中的所有文件,你的這種認識就需要變變了。
八、php和com
如果你喜歡冒險,并且在windows上運行cgi、isapi或apache模塊版本的php,就可以訪問com的函數。好了,詳細解釋com的工作就交給微軟和許多大部頭的書了,為了能簡單地了解一下com的功能,下面是一小段常見的腳本。
這一段php腳本在后端啟動微軟的字處理word,打開一個新的文檔,輸入一些文字,保存文檔,并關閉word。
<?
// 建立一個指向新com組件的索引
$word = new com("word.application") or die("can't start word!");
// 顯示目前正在使用的word的版本號
echo "loading word, v. {$word->version}<br>";
// 把它的可見性設置為0(假),如果要使它在最前端打開,使用1(真)
// to open the application in the forefront, use 1 (true)
$word->visible = 0;
// 在word中創建新的文檔
$word->documents->add();
// 在新文檔中添加文字
$word->selection->typetext("testing 1-2-3...");
//把文檔保存在windows臨時目錄中
$word->documents[1]->saveas("/windows/temp/comtest.doc");
// 關閉與com組件之間的連接
$word->quit();
// 在屏幕上顯示其他信息
echo "check for the file...";
?>
如果你有一個intranet網站,數據存儲在sql server中,用戶需要這些數據的excel格式,則可以讓php運行必要的sql查詢并對輸出進行格式化,然后利用com打開excel,把數據轉化為excel格式的數據,然后把數據保存在用戶的臺式機上。
九、php和java
php另一個有趣的功能是它可以調用現有的java 對象中的方法,使得你可以在基于java的應用中集成php。如果要在工作中推廣php的應用,這一功能就非常有用了,你得到的結果是,“這里的一切都是基于java的。”
要利用這一功能,你的服務器上必須安裝有jvm(java虛擬機器)。如果安裝的是由sun、kaffe、ibm或blackdown的jdk,就已經安裝有了jvm。
在配置php時,需要在配置文件中添加with-java小節,然后修改php.ini文件中的一部分,對php.ini文件的修改主要是需要添加下面的內容:
[java]
java.library.path=/path/to/library
java.class.path=/classpath/
extension_dir=/path/to/extensions
extension=libphp_java.so
需要注意的是,所作的修改與你的安裝類型有關,你需要閱讀php安裝目錄下ext/java目錄中readme文件,學習如何配置java功能。
下面是一段如何創建一個新的java對象的php腳本的例子,這段腳本將訪問并在顯示器是顯示一些java屬性。它與com的例子同樣有趣,應該會給我們一些啟發。
<?
$system = new java("java.lang.system");
echo "<p>java version = " . $system->getproperty("java.version") . "<br>";
echo "java vendor = " . $system->getproperty("java.vendor") . "</p>";
?>
如果你有java知識,將會對開發工作帶來很大的幫助,這種集成的能力是未來php被接受和增長的關健。
十、php和xml
php中包含有一個可選的支持expat解析的xml擴展,利用php中與xml相關的函數,可以創建一個分析程序來處理有效的xml文檔。如果你使用的是1.3.7版或版本更高的apache軟件,就不需要再安裝額外的庫文件了,你所需要作的就只是配置php中的with-xml。
新聞熱點
疑難解答