|
php具有快速、可靠、跨平臺(tái)應(yīng)用、源代碼開(kāi)放等特點(diǎn),使得php成為最受歡迎的服務(wù)器端Script語(yǔ)言之一。我根據(jù)自己在工作中體會(huì)到的,向大家介紹php使用的心得,希望對(duì)大家有所幫助。
利用php的Include files維護(hù)你的網(wǎng)站
不管你所開(kāi)發(fā)的網(wǎng)站的規(guī)模是大是小,你都應(yīng)該要認(rèn)識(shí)到重復(fù)使用程序代碼的重要性,不論你重復(fù)使用的是 php 程序或者是 HTML 原始碼。舉個(gè)例子來(lái)說(shuō),網(wǎng)站頁(yè)尾的版權(quán)宣告至少每年都得修改一次,如果你的網(wǎng)站有許多個(gè)頁(yè)面,該怎么辦呢?動(dòng)手一個(gè)一個(gè)修改這些頁(yè)面肯定是一件頭痛的事情。通過(guò) php 我們可以用幾個(gè)不同的方式來(lái)重復(fù)使用程序代碼。要使用哪些函數(shù)端視你要重復(fù)使用的是怎樣的內(nèi)容而定。
這些主要的函數(shù)包括:
* include() 與 include_once()
* require() 與 require_once()
1.include() 函數(shù)會(huì)將指定的檔案讀入并且執(zhí)行里面的程序。
例如:include('/home/me/myfile');
被導(dǎo)入的檔案中的程序代碼都會(huì)被執(zhí)行,而且這些程序在執(zhí)行的時(shí)候會(huì)擁有和源文件中呼叫到 include() 函數(shù)的位置相同的變量范圍(variable scope)。你可以導(dǎo)入同一個(gè)服務(wù)器中的靜態(tài)檔案,甚至可以通過(guò)合并使用 include() 與 fopen() 函數(shù)來(lái)導(dǎo)入其它服務(wù)器上面的檔案。
2.include_once()函數(shù)的作用和 include() 是幾乎相同的
唯一的差別在于 include_once() 函數(shù)會(huì)先檢查要導(dǎo)入的檔案是不是已經(jīng)在該程序中的其它地方被導(dǎo)入過(guò)了,如果有的話就不會(huì)再次重復(fù)導(dǎo)入該檔案(這項(xiàng)功能有時(shí)候是很重要的,比方說(shuō)要導(dǎo)入的檔案里面宣告了一些你自行定義好的函數(shù),那么如果在同一個(gè)程序重復(fù)導(dǎo)入這個(gè)檔案,在第二次導(dǎo)入的時(shí)候便會(huì)發(fā)生錯(cuò)誤訊息,因?yàn)?php 不允許相同名稱的函數(shù)被重復(fù)宣告第二次)。
3.require()函數(shù)會(huì)將目標(biāo)檔案的內(nèi)容讀入,并且把自己本身代換成這些讀入的內(nèi)容。
這個(gè)讀入并且代換的動(dòng)作是在 php 引擎編譯你的程序代碼的時(shí)候發(fā)生的,而不是發(fā)生在 php 引擎開(kāi)始執(zhí)行編譯好的程序代碼的時(shí)候(php 3.0 引擎的工作方式是編譯一行執(zhí)行一行,但是到了 php 4.0 就有所改變了,php 4.0 是先把整個(gè)程序代碼全部編譯完成后,再將這些編譯好的程序代碼一次執(zhí)行完畢,在編譯的過(guò)程中不會(huì)執(zhí)行任何程序代碼)。require() 通常來(lái)導(dǎo)入靜態(tài)的內(nèi)容,而 include() 則適合用來(lái)導(dǎo)入動(dòng)態(tài)的程序代碼。
4.如同 include_once()函數(shù),require_once() 函數(shù)會(huì)先檢查目標(biāo)檔案的內(nèi)容是不是在之前就已經(jīng)導(dǎo)入過(guò)了,如果是的話,便不會(huì)再次重復(fù)導(dǎo)入同樣的內(nèi)容。
我個(gè)人習(xí)慣使用 require() 函數(shù)來(lái)導(dǎo)入版權(quán)宣告(copyrights),靜態(tài)文字或其它本身不含有變量,或者本身需要倚賴其它執(zhí)行過(guò)的程序才能正確執(zhí)行的程序代碼。例如:
復(fù)制代碼 代碼如下:
<HTML>
<HEAD><TITLE>網(wǎng)頁(yè)標(biāo)題</TITLE></HEAD>
<BODY>
[一堆內(nèi)容]
<?
// 導(dǎo)入版權(quán)宣告文字
require('/home/me/mycopyright');
?>
</BODY>
</HTML>
另一方面,我通常在程序的開(kāi)頭使用 include() 函數(shù)來(lái)導(dǎo)入一些函式庫(kù)或者類似的程序代碼:
復(fù)制代碼 代碼如下:
<?
// 導(dǎo)入我的函式庫(kù)
include('/home/me/myfunctions');
// 利用之前導(dǎo)入的函式庫(kù)里面定義好的 php 函數(shù)執(zhí)行一些功能
?>
<HTML>
<HEAD><TITLE>網(wǎng)頁(yè)標(biāo)題</TITLE></HEAD>
<BODY>
[一堆內(nèi)容]
</BODY>
</HTML>
接下來(lái)你可能會(huì)問(wèn)這第一個(gè)挺符合邏輯的問(wèn)題:「這些被導(dǎo)入的檔案要放在哪兒呢?」簡(jiǎn)短的答案是:「放在服務(wù)器檔案系統(tǒng)里的任何地方都行。」然而,要留意的是如果被導(dǎo)入的檔案除了單純的程序代碼片段以外還包含了一些敏感資料,例如連結(jié)數(shù)據(jù)庫(kù)系統(tǒng)要用到的帳號(hào)和密碼,那么建議你不要把這些檔案放在 Web 服務(wù)器的文件根目錄之下,因?yàn)槟菢拥脑捤吮憧梢院苋菀椎馗`取到這些資料了。
你可以將這些被包含的檔案放在系統(tǒng)的任何一個(gè)目錄里面,唯一的條件是 php 本身用來(lái)執(zhí)行的身分(www,nobody 或者其它身分)必須要有足夠的權(quán)限能夠讀取這些檔案就可以了。這些檔案的擴(kuò)展名也可以任意取,甚至沒(méi)有附檔名也無(wú)所謂。
善用include()和 require()來(lái)將網(wǎng)站里面經(jīng)常需要變動(dòng)的共享內(nèi)容做合理的分割,在更新網(wǎng)站內(nèi)容的時(shí)候?qū)?huì)容易進(jìn)行得多。
利用php來(lái)維護(hù)檔案系統(tǒng)
php 提供了很多與檔案系統(tǒng)相關(guān)的函數(shù),讓我們不僅可以開(kāi)啟檔案,還能夠顯示目錄的內(nèi)容,搬移檔案的位置以及其它更多功能。有的朋友甚至寫(xiě)了能夠通過(guò)瀏覽器來(lái)管理檔案內(nèi)容的 php 程序。
在開(kāi)始介紹 php 的檔案系統(tǒng)相關(guān)功能之前,我們要先理清一件事情:在 Windows操作系統(tǒng)里面,檔案路徑可以使用斜線(/)或者反斜線(/)來(lái)表示,但是在其它操作系統(tǒng)里面我們只會(huì)使用到斜線。為了保持統(tǒng)一性,下面的例子里面的檔案路徑都是使用斜線。
下面的例子程序我將教大家基本的目錄內(nèi)容顯示功能,每個(gè)步驟都有批注,請(qǐng)直接閱讀。
復(fù)制代碼 代碼如下:
<? /* $dir_name 這個(gè)變量的值是你想要讀取的目錄的完整路徑 */
$dir_name = "/home/me/";
/* opendir()函數(shù)會(huì)開(kāi)啟某個(gè)目錄,并且傳回一個(gè)參考值(handle)讓我們可以用來(lái)在程序中參照到該目錄 */
$dir = opendir($dir_name);
/* 開(kāi)始建立一個(gè)字符串,這個(gè)字符串包含了 HTML 的列表卷標(biāo),用來(lái)顯示目錄中的文件名稱。 */
$file_list = "<ul>";
/* 使用一個(gè) while 循環(huán)敘述將前面開(kāi)啟的目錄中的檔案全部讀取一遍。如果讀取到的檔名不是「.」或者「..」,就把該檔名寫(xiě)入前面提到的字符串里面去。 */
while ($file_name = readdir($dir)) {
if (($file_name != ".") && ($file_name != "..")) {
$file_list .= "<li>$file_name";
}
}
/* 替 HTML 列表卷標(biāo)加上結(jié)尾 */
$file_list .= "</ul>";
/* 關(guān)閉之前開(kāi)啟的目錄并且結(jié)束這段 php 程序 */
closedir($dir);
?>
<!-- HTML原始碼從這里開(kāi)始 -->
<HTML>
<HEAD>
</HEAD>
<BODY>
<!-- 使用 php 程序來(lái)將我們所讀取的目錄名稱顯示在頁(yè)面上 -->
<P>Files in: <? echo "$dir_name"; ?></p>
<!-- 使用 php 程序?qū)⒃撃夸浿凶x取到的文件名顯示在頁(yè)面上 -->
<? echo "$file_list"; ?>
</BODY>
</HTML>
經(jīng)過(guò)上面幾步,你已經(jīng)成功把某個(gè)目錄中的文件名稱顯示在網(wǎng)頁(yè)上了。但你要記住一點(diǎn):要讀取某個(gè)目錄或者檔案(讀取檔案內(nèi)容的做法稍后會(huì)介紹),php 本身執(zhí)行所用的身分必須至少擁有該目錄或者檔案的讀取權(quán)限才行,否則系統(tǒng)會(huì)顯示權(quán)限不足的錯(cuò)誤訊息。
下一個(gè)例子我將教大家如何復(fù)制一個(gè)檔案:
復(fù)制代碼 代碼如下:
<? /* 變量$orginal儲(chǔ)存源文件的完整路徑,變量$copied儲(chǔ)存復(fù)制過(guò)去的新檔案的完整路徑 */
$original = "/home/me/mydatabasedump";
$copied = "/archive/mydatabasedumo_1010";
/* 呼叫 copy() 函數(shù)把檔案從原始位置復(fù)制一份到新的位置去。如果無(wú)法復(fù)制,那么便終止程序的執(zhí)行并且顯示錯(cuò)誤訊息。 */
@copy($original, $copied) or die("無(wú)法復(fù)制檔案。");
?>
上面的例子程序可以用來(lái)擴(kuò)充成為一個(gè)檔案?jìng)浞菹到y(tǒng)程序。當(dāng)這個(gè)程序執(zhí)行的時(shí)候,它會(huì)將數(shù)據(jù)庫(kù)的數(shù)據(jù)文件復(fù)制到其它目錄下面做為備份之用。只要修改系統(tǒng)的排程檔案內(nèi)容(crontab),我們便可以讓這個(gè)程序自動(dòng)在每天的固定時(shí)間執(zhí)行一次,達(dá)到系統(tǒng)自動(dòng)備份,不需要人工手動(dòng)執(zhí)行。
如果你的系統(tǒng)上面有安裝 Lynx 軟件(Lynx 是一種純文字的 Web 瀏覽器)的話,你可以在系統(tǒng)排程檔案里面加入下面這筆記錄來(lái)讓系統(tǒng)在固定時(shí)間自動(dòng)激活 Lynx 并且呼叫我們之前寫(xiě)好的 php 備份程序。當(dāng) Lynx 呼叫(瀏覽)我們的 php 程序的時(shí)候,該程序就會(huì)被執(zhí)行,并且產(chǎn)生備份文件。下面這個(gè)例子教你如何在每天早晨五點(diǎn)鐘執(zhí)行我們的備份程序,并且在執(zhí)行完以后自動(dòng)將 Lynx 程序關(guān)閉:
0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1
如果你的系統(tǒng)安裝的是 CGI 版本的 php,那么你可以直接呼叫 php 執(zhí)行檔而不需要通過(guò) Lynx 來(lái)呼叫我們的 php 程序
php中include和require有什么區(qū)別
平常是沒(méi)區(qū)別的.
當(dāng)要加載的文件不存在時(shí)候, include會(huì)給一個(gè)warning警告, 然后繼續(xù)運(yùn)行. 而require則會(huì)給一個(gè)fatal error, 直接結(jié)束腳本
=====================================================
php手冊(cè)里面是這樣說(shuō)的:
require() 和 include() 除了怎樣處理失敗之外在各方面都完全一樣。include() 產(chǎn)生一個(gè)警告而 require() 則導(dǎo)致一個(gè)致命錯(cuò)誤。換句話說(shuō),如果想在丟失文件時(shí)停止處理頁(yè)面,那就別猶豫了,用 require() 吧。include() 就不是這樣,腳本會(huì)繼續(xù)運(yùn)行。
php技術(shù):深入理解require與require_once與include以及include_once的區(qū)別,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。