明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

PHP的10個高級技巧

[摘要]全球超過300萬個互聯(lián)網(wǎng)網(wǎng)站的管理員都在使用PHP,使得它成為最為普及的服務(wù)器端腳本語言之一。其特點是運行速度快、穩(wěn)定可靠、跨平臺,而且是開放源代碼軟件。隨你使用的水平不同,PHP可以很簡單,也可以很復(fù)雜,可以只使用它發(fā)送HTML表格元素,還可以在PHP應(yīng)用程序中集成Java和XML。   如果...
全球超過300萬個互聯(lián)網(wǎng)網(wǎng)站的管理員都在使用PHP,使得它成為最為普及的服務(wù)器端腳本語言之一。其特點是運行速度快、穩(wěn)定可靠、跨平臺,而且是開放源代碼軟件。隨你使用的水平不同,PHP可以很簡單,也可以很復(fù)雜,可以只使用它發(fā)送HTML表格元素,還可以在PHP應(yīng)用程序中集成Java和XML。 

  如果你對PHP有一定的了解或者看過一些初步的教材,這些技巧可以擴展你對PHP的認(rèn)識,使你掌握一些常見的和高級的PHP功能。 

一、把PHP安裝為Apache的DSO 
  PHP在Linux/Unix平臺上經(jīng)常與Apache搭配使用,在安裝PHP時,有三種安裝方式可供選擇:靜態(tài)模式、動態(tài)模式(DSO)、CGI二進制模式。 

  由于易于維護和升級,我強烈建議以DSO方式安裝PHP。例如,初次安裝時如果安裝的PHP僅支持?jǐn)?shù)據(jù)庫,隨后希望再安裝支持加密的模塊,只要運行“make clean”,添加新的配置選項,然后再運行“make”和“make install”即可,一個新的PHP模塊就會安裝在Apache中適當(dāng)?shù)奈恢蒙,然后重新啟動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作準(zhǔn)備,用你自己的路徑替換其中的[path],例如,/usr/local/apache[version],現(xiàn)在已經(jīng)設(shè)置了mod_so的新值,它將允許Apache使用DSO模塊; 

  7、回到提示符狀態(tài)后鍵入make,并等待再次回到提示符狀態(tài); 

  8、執(zhí)行“make install”命令。 

  至此,Apache已經(jīng)安裝完畢,系統(tǒng)將重回到提示符狀態(tài)。接下來我們開始安裝PHP: 

  1、在PHP主頁的下載區(qū)中找到最新版本的鏈接; 

  2、把文件下載到一個適當(dāng)?shù)哪夸浿校?usr/local/或/opt/或者你指定的任意目錄中; 

  3、運行Gunzip對文件進行解壓縮,得到后綴為.tar的文件; 

  4、執(zhí)行下面的命令把文件安裝在php-[version]目錄中: 

   tar -xvf php-[version] 

  5、進入/usr/local/php-[version]目錄或在步驟4中指定的目錄; 

  至此,已經(jīng)作好了以DSO方式安裝PHP的準(zhǔn)備工作,唯一需要修改的配置選項是with-apxs(這是Apache的bin目錄中的一個文件)。為了得到較高的性能,我沒有安裝對MySQL的支持模塊。 

  ./configure --with-mysql=/[path to mysql] --with-apxs=/[path to apxs] 

  6、回到提示符狀態(tài)后執(zhí)行make命令,等待重新返回到提示符狀態(tài); 

  7、執(zhí)行make install命令。 

  至此,系統(tǒng)以DSO方式在Apache的模塊目錄中安裝了PHP,并對Apache的httpd.conf文件作適當(dāng)?shù)男薷暮蠓祷氐教崾痉麪顟B(tài);氐教崾痉麪顟B(tài)后,你還需要對Apache的httpd.conf文件作一些修改。 

  1、找到包含有ServerAdmin的一行,添加你的電子郵件地址,如下所示: 

   ServerAdmin you@yourdomain.com 

  2、找到以ServerName開頭的行,把它改為真正的值,例如: 

   ServerName localhost 

  3、找到內(nèi)容如下所示的小節(jié): 

  # And for PHP 4.x, use: 

  # 

  #AddType application/x-httpd-php .php 

  #AddType application/x-httpd-php-source .phps 

  修改這些行的內(nèi)容,使PHP 4.0的AddType不再成為注釋,并添加希望在PHP中使用的文件后綴名,上面的內(nèi)容變?yōu)槿缦滤镜膬?nèi)容: 

  # And for PHP 4.x, use: 

  # 

  AddType application/x-httpd-php .php .phtml 

  AddType application/x-httpd-php-source .phps 

  保存文件,回到上一級目錄,執(zhí)行下面的命令重新啟動Apache: 

  ./bin/apachectl start 

  如果在啟動時沒有出現(xiàn)錯誤提示信息,就可以通過創(chuàng)建一個名為phpinfo.php的只有如下所示一行內(nèi)容的文件,對安裝的Apache、PHP進行測試: 

  <? phpinfo() ?> 

  把這個文件保存到Apache的文檔根目錄(htdocs)中,然后開啟瀏覽器,鍵入http://localhost/phpinfo.php地址,屏幕上就會出現(xiàn)許多的變量和它們的值。 

  如果要重新配置PHP,需要再次運行make clean命令,然后執(zhí)行帶有一系列選項的./configure命令,然后再執(zhí)行make和make install命令,Apache的目錄模塊中就會出現(xiàn)一個新的模塊,只要再重新啟動Apache加載這個新的模塊,就一切OK了。 

二、使用PHP本身的對話 
  PHP 4.0中最令人期待的特性應(yīng)該是對對話的支持,PHP 3.0的用戶必須使用第三方的軟件否則就不能使用對話,不支持對話一直是PHP最大的缺憾之一。 

  只要用戶在瀏覽你的網(wǎng)站,你就可以利用對話維護與特定用戶有關(guān)的變量,而無需建立多個cookie、使用隱藏表格字段或?qū)⑿畔⒋鎯υ跀?shù)據(jù)庫中。 

  在一個網(wǎng)頁上啟動一個對話,就會使PHP引擎知道你想啟動一個對話(如果還沒有啟動)或者繼續(xù)當(dāng)前的對話: 

session_start(); 

  啟動一個對話將通過cookie向用戶發(fā)送一個識別字符串(例如940f8b05a40d5119c030c9c7745aead9),在服務(wù)器端,會創(chuàng)建一個與識別字符串匹配的臨時文件,例如sess_940f8b05a40d5119c030c9c7745aead9,這個文件中包含注冊的對話變量以及它們的值。 

  用來顯示對話的作用的最常見的例子是訪問計數(shù)器。啟動PHP模塊,確保PHP代碼是文件的第一行,在PHP代碼之前不要有空格、HTML代碼和其他的代碼。因為對話會發(fā)送一個頭部,因此如果在session_start()之前有空格和HTML代碼,就會得到一個出錯信息。 

  <? 

  // 如果還不存在一個針對某用戶的用戶,則啟動一個對話: 

  session_start(); 

  然后注冊一個名字為count的變量: 

  session_register(’count’); 

  注冊一個對話變量后,只要對話存在,名字為count的變量也就存在,F(xiàn)在,count變量還沒有被賦值,如果對它執(zhí)行加1操作,它的值就變?yōu)榱?。 

  $count++; 

  把上述內(nèi)容綜合在一塊兒,如果還沒有啟動一個對話,就會啟動一個對話;如果不存在一個對話id,就為用戶指定一個好了,注冊一個名字為$count的變量,對$count執(zhí)行加1操作表示用戶已經(jīng)首次訪問了該網(wǎng)頁。 

  要知道用戶在當(dāng)前的對話中訪問本頁面的次數(shù),只要顯示$count變量的值即可: 

  echo "<P>You’ve been here $count times.</p>"; 

  全部的訪問計數(shù)器代碼如下所示: 

  <? 

  session_start(); 

  session_register(’count’); 

  $count++; 

  echo "<P>You’ve been here $count times.</p>"; 

  ?> 
[page_break] 如果重新加載上述的腳本文件,就會發(fā)現(xiàn)變量count的值增加了1,很酷吧。 

  還可以在對話中注冊一個數(shù)組變量,假設(shè)我們注冊了一個名字為$faves的變量: 

  $faves = array (’chocolate’,’coffee’,’beer’,’linux’); 

  可以象注冊一個簡單變量那樣注冊一個數(shù)組變量: 

  session_register(’faves’); 

  引用數(shù)組變量與引用簡單變量沒有什么二樣,如果一個用戶在網(wǎng)頁上指出在生活中的愛好時,可以把他的愛好注冊到一個被稱作$faves的數(shù)組變量中,然后可以在另一個網(wǎng)頁中很方便地把這些愛好顯示出來: 

  <? 

  session_start(); 

  echo "My user likes: 

  <ul>"; 

  while (list(,$v) = each ($faves)) { 

  echo "<li>$v"; } 

  echo "</ul>"; 

  ?> 

  然后你就得到了一個關(guān)于用戶愛好的清單。 

  對話變量不能被查詢字符串覆蓋,也就是說我們不能輸入http:///www.yourdomain.com/yourscript.php?count=56給注冊變量$count指定一個新值,這一點對于安全很重要:只能在服務(wù)器端的腳本中刪除一個沒有注冊的對話變量。 

  如果要完全刪除一個對話變量,首先需要從系統(tǒng)中注銷它: 

  session_unregister(’count’); 

  要完全刪除一個對話變量的腳本是非常簡單,如下所示: 

  session_destroy(); 

  使用對話變量可以減少訪問數(shù)據(jù)庫的頻率,使代碼更加清晰,而且可以減少對用戶發(fā)送的cookie的數(shù)量,它是最簡單的方法了。 
三、文件是我們的朋友 
  無論你在開發(fā)的網(wǎng)站規(guī)模的大小,都應(yīng)該意識到代碼重用的重要性,無論這些代碼是HTML、還是PHP代碼。例如,你必須至少每年改變一次包含版權(quán)信息的頁腳,如果你的網(wǎng)站含有1000個頁面,每年修改一次也是個很煩人的事兒。 

  在PHP中,至少有幾個函數(shù)可以幫助你實現(xiàn)代碼重用的目的,所使用的函數(shù)取決于你所重用的代碼,主要的函數(shù)有: 

  * include() and include_once() 

  * require() and require_once() 

  include()函數(shù)包含并對給定的文件進行計算,例如: 

  include(’/home/me/myfile’); 

  在include文件中的任何代碼都在include()出現(xiàn)的代碼范圍內(nèi)執(zhí)行,你可以通過聯(lián)合使用include()和fopen()在自己的服務(wù)器上包含靜態(tài)文件,在另一臺服務(wù)器上包含目標(biāo)文件。 

  include_once()的功能與include()相同,二者之間的區(qū)別在于它會檢查一個文件中的代碼是否已經(jīng)包含在現(xiàn)有的腳本中,如果代碼已經(jīng)存在,則不會再次包含它。 

   require()函數(shù)用給定文件的內(nèi)容取代它本身,這一代替過程發(fā)生在PHP引擎編譯代碼期間,而不是在執(zhí)行期間進行,它不象include()那樣會首先進行計算。require()函數(shù)更多地用在靜態(tài)元素中,而include()更多地用于動態(tài)元素中。與include_once()類似的是,require_once()將首先檢查是否已經(jīng)插入給定的代碼,如果代碼已經(jīng)存在,就不再插入了。 

  為也了解其內(nèi)容,在版權(quán)信息、靜態(tài)文字和其他不包含變量的元素或者依賴其他正在執(zhí)行的腳本的元素中我更趨向于使用require函數(shù)。例如: 

  <HTML> 

  <HEAD><TITLE>Something</TITLE></HEAD> 

  <BODY> 

  [a lot of content] 

  <? 

  // insert copyright 

  require(’/home/me/mycopyright’); 

  ?> 

  </BODY> 

  </HTML> 

  另一方面,我經(jīng)常在文件的開始使用include()來控制許多的函數(shù): 

  <? 

  //得到函數(shù)庫 

  include(’/home/me/myfunctions’); 

  // do PHP things with my functions ?> 

  <HTML> 

  <HEAD><TITLE>Something</TITLE></HEAD> 

  <BODY> 

  [a lot of content] 

  </BODY> 

  </HTML> 

  下一個問題就該是“include和require文件在哪里?”,對這個問題簡單的回答是,“系統(tǒng)中的任意地方!比绻愕拇a中包含有帶有用戶名和口令的數(shù)據(jù)庫連接,你肯定不會將它們都放在文檔根目錄中向所有的人都開放。 

  included或required文件可以在系統(tǒng)上的任何地方,只要PHP運行的系統(tǒng)上的用戶可以訪問這些文件即可,你可以使這些文件具有任何后綴,或者不使用后綴。 

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

四、PHP和文件系統(tǒng)的維護 
  PHP中有許多與文件系統(tǒng)有關(guān)的函數(shù),這些函數(shù)不僅可以打開文件,還可以顯示目錄中的內(nèi)容、移動文件和其他一些功能,許多人甚至用PHP開發(fā)基于互聯(lián)網(wǎng)的文件資源管理器。 

  關(guān)于文件路徑的解釋:在Windows中,可以在路徑中使用/和\符號,而在其他的操作系統(tǒng)中只能使用/符號。出于一致性的緣故,我們統(tǒng)一使用/符號。 

  下面的腳本樣例可以顯示一個目錄清單,注釋已經(jīng)包含在代碼中: 

  <? /*把要讀取的目錄的全路徑名存入一個名字為$dir_name的變量中。 */ 

  $dir_name = "/home/me/"; 

  /* 創(chuàng)建一個句柄,其值是打開一個給定目錄的結(jié)果*/ 

  $dir = opendir($dir_name); 

  /* 建立一個文字塊,用以放置列表元素(文件名字)*/ 

  $file_list = "<ul>"; 

  /* 使用一個while語句,讀取已經(jīng)打開的目錄中的所有元素,如果文件的名字不是“.”或“..”,則顯示列表中的名字*/ 

  while ($file_name = readdir($dir)) { 

  if (($file_name != ".") && ($file_name != "..")) { 

  $file_list .= "<li>$file_name"; 

  } 

  } 

  $file_list .= "</ul>"; 

  /*關(guān)閉打開的目錄,結(jié)束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> 

  好了,我們已經(jīng)得到了一個目錄清單。需要注意的是,要讀取一個文件(稍后我們將進行講解)或目錄的內(nèi)容,PHP運行的系統(tǒng)上的用戶必須至少有讀取文件的權(quán)限。 

  下面是一個如何拷貝文件的例子: 

  <? /*把你要拷貝的原文件的全路徑賦給一個名字為$original的變量中,把拷貝的文件的全路徑賦予一個名字為$copied的變量中*/ 

  $original = "/home/me/mydatabasedump"; 

  $copied = "/archive/mydatabasedumo_1010"; 

  /* 使用copy()函數(shù)拷貝原始文件,如果拷貝沒有完成則會顯示一個錯誤信息*/ 

  @copy($original, $copied) or die("Couldn’t copy file."); 

  ?> 

  這個例子是一個文件備份系統(tǒng)的原型。在這段腳本運行時,它把文件拷貝到一個不同的位置進行保存。稍微修改一下守護程序,就可以在一天中你指定的時刻執(zhí)行它,而無需用戶的干預(yù)。 

  假定你在系統(tǒng)上安裝了Lynx,可以創(chuàng)建一個守護程序的條目訪問這個文件,訪問這個文件會運行這個腳本并建立一個拷貝文件,下面的例子將在上午5點鐘運行這個腳本,然后關(guān)閉Lynx: 

  0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1 

  如果運行的是CGI版本的PHP,可以跳過Lynx部分,而直接調(diào)用二進制文件: 

  0 5 * * * [username] php /path/to/copyfile.php 1>/dev/null 2>&1 
[page_break]五、豐富的數(shù)組函數(shù) 
  PHP 4.0中新添加了30個與組數(shù)有關(guān)的函數(shù),其中一些常見的函數(shù)可以判斷一個數(shù)組中是否包含某個元素,對一個數(shù)組中的元素進行計數(shù),添加或刪除數(shù)組中的元素或者對數(shù)組中的元素進行排序。 

  如果有一個很大的數(shù)組,而你需要找出其中是否包含一個特定的元素,就可以使用in_array()。下面的例子將顯示“Not found in this array”,因為在一個名字為$namesArray的數(shù)組中查找Albert,而在$namesArray數(shù)組中不存在這樣一個元素。 

  <? $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數(shù)組中的一個元素。 

  如果要對一個數(shù)組中的元素個數(shù)進行計數(shù),只要簡單地使用count()函數(shù)即可: 

  <? $namesArray = array("Joe", "Jane", "Bob", "Mary", "Paul", "Eddie", "John"); 

  $count = count($namesArray); ?> 

  返回的$count的值為7。 

  可以在一個數(shù)組的開頭或結(jié)尾處添加元素,還可以使用array_merge()來建立一個包含二個或更多數(shù)組中元素的新數(shù)組,合并時,元素的順序會按指定的順序排列,如果原來的數(shù)組是被排過序的,在合并后需要對它重新排序。 

  我們可以首先利用array_push()在數(shù)組的結(jié)尾處添加一個元素: 

  <? /* 建立一個數(shù)組 */ 

  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

  /* 向數(shù)組中添加元素 */ 

  array_push($fruitArray, "grape", "pineapple", "tomato"); 

  /*顯示每個元素及其序號*/ 

  while (list($key,$value) = each($fruitArray)) { 

  echo "$key : $value<br>"; 

  } 

  ?> 

  運行上面的程序?qū)⒌玫较旅娴慕Y(jié)果: 

  0 : apple 

  1 : orange 

  2 : banana 

  3 : kiwi 

  4 : pear 

  5 : grape 

  6 : pineapple 

  7 : tomato 

  如果需要在數(shù)組的開頭添加元素,其代碼與上面的代碼差不多,唯一的不同之處是需要用array_unshift()代替array_push()。 

  <? 

  /* 建立一個數(shù)組*/ 

  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

  /* 向數(shù)組中添加元素*/ 

  array_unshift($fruitArray, "grape", "pineapple", "tomato"); 

  /* 顯示每個元素及其序號*/ 

  while (list($key,$value) = each($fruitArray)) { 

  echo "$key : $value<br>"; 

  } 

  ?> 

  運行上面的程序?qū)⒌玫较旅娴慕Y(jié)果: 

  0 : grape 

  1 : pineapple 

  2 : tomato 

  3 : apple 

  4 : orange 

  5 : banana 

  6 : kiwi 

  7 : pear 

  array_merge()函數(shù)可以把二個或更多的數(shù)組合并為一個數(shù)組。 

  <? /*建立第一個數(shù)組*/ 

  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

  /*/建立第二個數(shù)組*/ 

  $vegArray = array("carrot", "green beans", "asparagus", "artichoke", "corn"); 

  /*把這二個數(shù)組合并為一個數(shù)組*/ 

  $goodfoodArray = array_merge($fruitArray, $vegArray); 

  /* 顯示每個元素及其序號*/ 

  while (list($key,$value) = each($goodfoodArray)) { 

  echo "$key : $value<br>"; 

  } 

  ?> 

  運行上面的腳本將得到下面的結(jié)果: 

  0 : apple 

  1 : orange 

  2 : banana 

  3 : kiwi 

  4 : pear 

  5 : carrot 

  6 : green beans 

  7 : asparagus 

  8 : artichoke 

  9 : corn 

  現(xiàn)在我們已經(jīng)掌握了如何添加元素和合并數(shù)組,我們再來看看如何從一個數(shù)組中刪除元素。從一個數(shù)組的末尾刪除一個元素可以使用array_pop()函數(shù),使用array_shift()函數(shù)可以從一個數(shù)組的開頭刪除一個元素。盡管使用array_pop()或 array_shift()從數(shù)組中刪除了一個元素,你還可以把這個元素當(dāng)作一個變量來使用。 

  使用array_pop()從一個數(shù)組的末尾刪除一個元素: 

  <? 

  /*建立一個數(shù)組*/ 

  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

  /* 從數(shù)組的末尾刪除一個元素*/ 

  $popped = array_pop($fruitArray); 

  /* 顯示刪除后數(shù)組的內(nèi)容和你刪除的元素*/ 

  while (list($key,$value) = each($fruitArray)) { 

  echo "$key : $value<br>"; 

  } 

  echo "<br>and finally, in $popped: $popped"; 

  ?> 

  運行上面的腳本會得到下面的結(jié)果: 

  0 : apple 

  1 : orange 

  2 : banana 

  3 : kiwi 

  and finally, in $popped: pear 

  我們再來討論一個從一個數(shù)組的末尾刪除元素的例子: 

  <? 

  /* 建立一個數(shù)組*/ 

  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

  /*從一個數(shù)組的開始刪除一個元素*/ 

  $shifted = array_shift($fruitArray); 

  /* 顯示刪除后數(shù)組的內(nèi)容和你刪除的元素*/ 

  while (list($key,$value) = each($fruitArray)) { 

  echo "$key : $value<br>"; 

  } 

  echo "<br>and finally, in $shifted: $shifted"; 

  ?> 

  運行上述腳本會得到如下的顯示結(jié)果: 

  0 : orange 

  1 : banana 

  2 : kiwi 

  3 : pear 

  and finally, in $shifted: apple 

  另外還有幾個函數(shù)可以對數(shù)組中的元素進行排序,但在這里我們將只簡要介紹基本的排序函數(shù),說明排序的過程: 

  <? /*建立一個數(shù)組*/ 

  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

  /* 對數(shù)組進行排序*/ 

  sort($fruitArray); 

  /*顯示每個元素及其序號*/ 

  while (list($key,$value) = each($fruitArray)) { 

  echo "$key : $value<br>"; 

  } 

  ?> 

  運行上述的腳本會得到如下的顯示結(jié)果: 

  0 : apple 

  1 : banana 

  2 : kiwi 

  3 : orange 

  4 : pear 
[page_break]六、動態(tài)圖像的創(chuàng)建 
  只要安裝一些第三方的庫文件并具有一定的幾何知識,就可以利用PHP來創(chuàng)建和處理圖像了。事實上,這不需要太多的幾何知識,因為我大學(xué)沒有畢業(yè),仍然可以利用PHP創(chuàng)建圖像。 

  在使用基本的圖像創(chuàng)建函數(shù)之前,需要安裝GD庫文件。如果要使用與JPEG有關(guān)的圖像創(chuàng)建函數(shù),還需要安裝jpeg-6b,如果要在圖像中使用Type 1型字體,則必須安裝t1lib。 

  在建立圖像創(chuàng)建環(huán)境之前,還需要作一些準(zhǔn)備工作。首先,安裝t1lib;其次安裝jpeg-6b,然后再安裝GD庫文件。在安裝時一定要按這里給定的順序進行安裝,因為在編譯GD為庫時會用到j(luò)peg-6b,如果沒有安裝jpeg-6b,在編譯時就會出錯。 

  在安裝完這三個組件后,還需要重新配置PHP,這也是你對采用DSO方式安裝PHP感到慶幸的地方之一。運行make clean,然后在當(dāng)前的配置中添加下面的內(nèi)容: 

  --with-gd=[/path/to/gd] 

  --with-jpeg-dir=[/path/to/jpeg-6b] 

  --with-t1lib=[/path/to/t1lib] 

  完成添加后執(zhí)行make命令,然后再執(zhí)行make install命令。重新啟動Apache后運行phpinfo()來檢查一下新的設(shè)置是否生效了,F(xiàn)在就可以開始圖像創(chuàng)建工作了。 

  根據(jù)所安裝的GD庫文件的版本不同,你也許能或者不能創(chuàng)建GIF或PNG格式的圖形文件,如果安裝的是gd-1.6或以前的版本,可以使用GIF格式的文件但不能創(chuàng)建PNG格式,如果安裝的是gd-1.6以后的版本,可以創(chuàng)建PNG文件但不能創(chuàng)建GIF格式的文件。 

  創(chuàng)建一幅簡單的圖像也需要用到許多的函數(shù),我們將一步一步地進行說明。 

  在這個例子中,我們將創(chuàng)建一個PNG格式的圖像文件,下面的代碼是一個包含所創(chuàng)建的圖像的MIME類型的頭部: 

  <? header ("Content-type: image/png"); 

  使用ImageCreate()創(chuàng)建一個代表空白圖像的變量,這個函數(shù)要求以像素為單位的圖像大小的參數(shù),其格式是ImageCreate(x_size, y_size)。如果要創(chuàng)建一個大小為250X250的圖像,就可以使用下面的語句: 

  $newImg = ImageCreate(250,250); 

  由于圖像還是空白的,因此你可能會希望用一些彩色來填充它。然而,你需要首先使用ImageColorAllocate()函數(shù)用其RGB值為這種顏色指定一個名字,這一函數(shù)的格式為ImageColorAllocate([image], [red], [green], [blue])。如果要定義天藍(lán)色,可以使用如下的語句: 

  $skyblue = ImageColorAllocate($newImg,136,193,255); 

  接下來,需要使用ImageFill()函數(shù)用這種顏色填充這個圖像,ImageFill()函數(shù)有幾個版本,例如ImageFillRectangle()、ImageFillPolygon()等。為簡單起見,我們通過如下的格式使用ImageFill()函數(shù): 

  ImageFill([image], [start x point], [start y point], [color]) 

  ImageFill($newImg,0,0,$skyblue); 

  最后,建立圖像后釋放圖像句柄和所占用的內(nèi)存: 

  ImagePNG($newImg); 

  ImageDestroy($newImg); ?> 

  這樣,創(chuàng)建圖像的全部代碼如下所示: 

  <? 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,并用瀏覽器訪問它,就會看到一個天藍(lán)色的250X250的PNG格式的圖像。 

  我們還可以使用圖像創(chuàng)建函數(shù)對圖像進行處理,例如把一個較大圖像作成一個小圖像: 

  假設(shè)你有一幅圖像,想從中裁剪出一個35X35大小的圖像。你所需要作的是創(chuàng)建一個35X35大小的空白圖像,創(chuàng)建一個包含原來圖像的圖像流,然后把一個經(jīng)過調(diào)整大小的原來的圖像放到新的空白圖像中。 

  要完成這一任務(wù)的關(guān)健函數(shù)是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])。 

  <? /* 發(fā)送一個頭部,以便讓瀏覽器知道該文件所包含的內(nèi)容類型*/ 

  header("Content-type: image/png"); 

  /* 建立保存新圖像高度和寬度的變量*/ 

  $newWidth = 35; 

  $newHeight = 35; 

  /* 建立給定高度和寬度的新的空白圖像*/ 

  $newImg = ImageCreate($newWidth,$newHeight); 

  /* 從原來較大的圖像中得到數(shù)據(jù)*/ 

  $origImg = ImageCreateFromPNG("test.png"); 

  /*拷貝調(diào)整大小后的圖像,使用ImageSX()、ImageSY()得到原來的圖像在X、Y方面上的大小 */ 

  ImageCopyResized($newImg,$origImg,0,0,0,0,$newWidth,$newHeight,ImageSX($origImg),ImageSY($origImg)); 

  /*創(chuàng)建希望得到的圖像,釋放內(nèi)存 */ 

  ImagePNG($newImg); 

  ImageDestroy($newImg); ?> 

  如果把這一小段腳本保存為resized.php,然后用瀏覽器對它進行訪問,就會看到一個35X35大小的PNG格式的圖形。 

七、基于PHP的用戶認(rèn)證 
  如果希望在每一段腳本上都進行口令保護,可以結(jié)合使用header()語句、$PHP_AUTH_USER和$PHP_AUTH_PW來建立基本的認(rèn)證方案,通常的基于服務(wù)器的提問/響應(yīng)順序都如下所示: 

  1、用戶從服務(wù)器上請求一個文件。如果這個文件在服務(wù)器上是被保護的,則在響應(yīng)的頭部向用戶返回一個401(示經(jīng)授權(quán)的用戶)字符串。 

  2、瀏覽器收到這個響應(yīng)后,彈出要求用戶輸入用戶名/口令的對話框。 

  3、用戶在對話框中輸入一個用戶名和口令,點擊OK按鈕將信息返回服務(wù)器供認(rèn)證使用。 

  4、如果用戶名和口令有效,被保護的文件將向用戶開放,只要用戶還在使用文件,認(rèn)證會一直有效。 

  一段簡單的PHP腳本文件通過向用戶發(fā)送一個適當(dāng)?shù)哪軌蛞鹱詣语@示用戶名/口令對話框的HTTP頭部就可以模仿HTTP的提問/響應(yīng)系統(tǒng),PHP把用戶在用戶名/口令對話框中輸入的信息存儲在$PHP_AUTH_USER和$PHP_AUTH_PW中,使用這二個變量,就可以與存儲在文本文件、數(shù)據(jù)庫等文件中的用戶名/口令進行比較。 

  這個例子采用了二個硬編碼的值進行認(rèn)證,但無論用戶名和口令放在什么地方,其原理都是相同的。 

  <? 

  /* 檢查$PHP_AUTH_USER和$PHP_AUTH_PW中的值*/ 

  if ((!isset($PHP_AUTH_USER))   (!isset($PHP_AUTH_PW))) { 

    /* 如果沒有值,則發(fā)送一個能夠引發(fā)對話框出現(xiàn)的頭部*/ 

    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")) { 

     /* 如果輸入的用戶名和口令中有一個不正確,則發(fā)送一個能夠引發(fā)對話框出現(xiàn)的頭部 */ 

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

    } 

  } 

  ?> 

  需要注意的是,如果你使用的是基于文件的保護機制,它并不能保證目錄中所有的文件的安全。它可能保護大部分的文件,如果你認(rèn)為它能夠保護給定目錄中的所有文件,你的這種認(rèn)識就需要變變了。 

八、PHP和COM 
  如果你喜歡冒險,并且在Windows上運行CGI、ISAPI或Apache模塊版本的PHP,就可以訪問COM的函數(shù)。好了,詳細(xì)解釋COM的工作就交給微軟和許多大部頭的書了,為了能簡單地了解一下COM的功能,下面是一小段常見的腳本。 

  這一段PHP腳本在后端啟動微軟的字處理Word,打開一個新的文檔,輸入一些文字,保存文檔,并關(guān)閉Word。 

  <? 

  // 建立一個指向新COM組件的索引 

  $word = new COM("word.application") or die("Can’t start Word!"); 

  // 顯示目前正在使用的Word的版本號 

  echo "Loading Word, v. {$word->Version}<br>"; 

  // 把它的可見性設(shè)置為0(假),如果要使它在最前端打開,使用1(真) 

  // to open the application in the forefront, use 1 (true) 

  $word->Visible = 0; 

  // 在Word中創(chuàng)建新的文檔 

  $word->Documents->Add(); 

  // 在新文檔中添加文字 

  $word->Selection->TypeText("Testing 1-2-3..."); 

  //把文檔保存在Windows臨時目錄中 

  $word->Documents[1]->SaveAs("/Windows/temp/comtest.doc"); 

  // 關(guān)閉與COM組件之間的連接 

  $word->Quit(); 

  // 在屏幕上顯示其他信息 

  echo "Check for the file..."; 

  ?> 

  如果你有一個intranet網(wǎng)站,數(shù)據(jù)存儲在SQL Server中,用戶需要這些數(shù)據(jù)的Excel格式,則可以讓PHP運行必要的SQL查詢并對輸出進行格式化,然后利用COM打開Excel,把數(shù)據(jù)轉(zhuǎn)化為Excel格式的數(shù)據(jù),然后把數(shù)據(jù)保存在用戶的臺式機上。 

九、PHP和Java 
  PHP另一個有趣的功能是它可以調(diào)用現(xiàn)有的Java 對象中的方法,使得你可以在基于Java的應(yīng)用中集成PHP。如果要在工作中推廣PHP的應(yīng)用,這一功能就非常有用了,你得到的結(jié)果是,“這里的一切都是基于Java的! 

  要利用這一功能,你的服務(wù)器上必須安裝有JVM(Java虛擬機器)。如果安裝的是由Sun、Kaffe、IBM或Blackdown的JDK,就已經(jīng)安裝有了JVM。 

  在配置PHP時,需要在配置文件中添加with-java小節(jié),然后修改php.ini文件中的一部分,對php.ini文件的修改主要是需要添加下面的內(nèi)容: 

  [Java] 

  java.library.path=/path/to/library 

  java.class.path=/classpath/ 

  extension_dir=/path/to/extensions 

  extension=libphp_java.so 

  需要注意的是,所作的修改與你的安裝類型有關(guān),你需要閱讀PHP安裝目錄下ext/java目錄中README文件,學(xué)習(xí)如何配置Java功能。 

  下面是一段如何創(chuàng)建一個新的Java對象的PHP腳本的例子,這段腳本將訪問并在顯示器是顯示一些Java屬性。它與COM的例子同樣有趣,應(yīng)該會給我們一些啟發(fā)。 

  <? 

  $system = new Java("java.lang.System"); 

  echo "<P>Java version = " . $system->getProperty("java.version") . "<br>"; 

  echo "Java vendor = " . $system->getProperty("java.vendor") . "</p>"; 

  ?> 

  如果你有Java知識,將會對開發(fā)工作帶來很大的幫助,這種集成的能力是未來PHP被接受和增長的關(guān)健。 

十、PHP和XML 
  PHP中包含有一個可選的支持Expat解析的XML擴展,利用PHP中與XML相關(guān)的函數(shù),可以創(chuàng)建一個分析程序來處理有效的XML文檔。如果你使用的是1.3.7版或版本更高的Apache軟件,就不需要再安裝額外的庫文件了,你所需要作的就只是配置PHP中的with-xml。



標(biāo)簽:PHP的10個高級技巧