PHP中的十個進階技巧

來源:互聯網
上載者:User

全球超過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 you@chinahtml.com

  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進行測試:

  

  把這個檔案儲存到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 "
You've been here $count times.

";

  全部的訪問計數器代碼如下所示:

     session_start();
session_register('count');
$count++;
echo "
You've been here $count times.

";
?>

  如果重新載入上述的指令檔,就會發現變數count的值增加了1,很酷吧。
還可以在對話中註冊一個陣列變數,假設我們註冊了一個名字為$faves的變數:

  $faves = array ('chocolate','coffee','beer','linux');
可以象註冊一個簡單變數那樣註冊一個陣列變數:
session_register('faves');

  引用陣列變數與引用簡單變數沒有什麼二樣,如果一個使用者在網頁上指出在生活中的愛好時,可以把他的愛好註冊到一個被稱作$faves的陣列變數中,然後可以在另一個網頁中很方便地把這些愛好顯示出來:

     session_start();
echo "My user likes:

";
while (list(,$v) = each ($faves)) {
echo "
$v"; }
echo "
";
?>

  然後你就得到了一個關於使用者愛好的清單。

  對話變數不能被查詢字串覆蓋,也就是說我們不能輸入http://www.cndw.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函數。例如:

  

[a lot of content]
// insert copyright
require('/home/me/mycopyright');
?>

  另一方面,我經常在檔案的開始使用include()來控制許多的函數:

     //得到函數庫
include('/home/me/myfunctions');
// do PHP things with my functions ?>

[a lot of content]

  下一個問題就該是“include和require檔案在哪裡?”,對這個問題簡單的回答是,“系統中的任意地方。”如果你的代碼中包含有帶有使用者名稱和口令的資料庫連接,你肯定不會將它們都放在主目錄中向所有的人都開放。

  included或required檔案可以在系統上的任何地方,只要PHP啟動並執行系統上的使用者可以訪問這些檔案即可,你可以使這些檔案具有任何尾碼,或者不使用尾碼。

  使用include()和require()對在網站中的元素進行具體化是一種普遍的現象,並在需要對網站升級時,給你帶來很大的方便。

四、PHP和檔案系統的維護

  PHP中有許多與檔案系統有關的函數,這些函數不僅可以開啟檔案,還可以顯示目錄中的內容、移動檔案和其他一些功能,許多人甚至用PHP開發基於互連網的檔案總管。

  關於檔案路徑的解釋:在Windows中,可以在路徑中使用/和符號,而在其他的作業系統中只能使用/符號。出於一致性的緣故,我們統一使用/符號。

  下面的指令碼範例可以顯示一個目錄清單,注釋已經包含在代碼中:

     $dir_name = "/home/me/";
/* 建立一個控制代碼,其值是開啟一個給定目錄的結果*/
$dir = opendir($dir_name);
/* 建立一個文字塊,用以放置列表元素(檔案名稱字)*/
$file_list = "
";
/* 使用一個while語句,讀取已經開啟的目錄中的所有元素,如果檔案的名字不是“.”或“..”,則顯示列表中的名字*/
while ($file_name = readdir($dir)) {
if (($file_name != ".") && ($file_name != "..")) {
$file_list .= "
$file_name";
}
}
$file_list .= "
";
/*關閉開啟的目錄,結束PHP模組*/
closedir($dir);
?>

  好了,我們已經得到了一個目錄清單。需要注意的是,要讀取一個檔案(稍後我們將進行講解)或目錄的內容,PHP啟動並執行系統上的使用者必須至少有讀取檔案的許可權。
下面是一個如何拷貝檔案的例子:

     $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數組中不存在這樣一個元素。

     $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()函數即可:

     $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
";
}
?>

  運行上面的程式將得到下面的結果:
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
";
}
?>
運行上面的程式將得到下面的結果:

  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
";
}
?>

  運行上面的指令碼將得到下面的結果:

  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
";
}
echo "
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
";
}
echo "
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
";
}
?>

  運行上述的指令碼會得到如下的顯示結果:

  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類型的頭部:

  
使用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); ?>

  這樣,建立映像的全部代碼如下所示:

     $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 "
You're authorized!

";
}
}
?>

  需要注意的是,如果你使用的是基於檔案的保護機制,它並不能保證目錄中所有的檔案的安全。它可能保護大部分的檔案,如果你認為它能夠保護給定目錄中的所有檔案,你的這種認識就需要變變了。

八、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}
";
// 把它的可見度設定為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 "
Java version = " . $system->getProperty("java.version") . "
";
echo "Java vendor = " . $system->getProperty("java.vendor") . "

";
?>
如果你有Java知識,將會對開發工作帶來很大的協助,這種整合的能力是未來PHP被接受和增長的關健。

十、PHP和XML
PHP中包含有一個可選的支援Expat解析的XML擴充,利用PHP中與XML相關的函數,可以建立一個剖析器來處理有效XML文檔。如果你使用 的是1.3.7版或版本更高的Apache軟體,就不需要再安裝額外的庫檔案了,你所需要作的就只是配置PHP中的with-xml。

  象Java和COM一樣,PHP中對XML的支援也很有趣,而且增長也很快,如果你瞭解Expat或LibXML,請加入這一方面的開發吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.