從PHP誕生之日起,PHP就開始在Web應(yīng)用方面為廣大的程序員服務(wù)。同時,作為針對Web開發(fā)量身定制的腳本語言,PHP一直秉承簡單、開源的思想,這也使得PHP得以快速的發(fā)展,并且大力地推動Web2.0的出現(xiàn)與發(fā)展。但是,長期以來,PHPer(PHP Programmers)被認為是處于草根階層的程序員,被認為是技術(shù)含量少,層次低的程序員。這點在國內(nèi)尤其突出。

成都創(chuàng)新互聯(lián)成立10余年來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)站策劃、網(wǎng)頁設(shè)計、域名與空間、網(wǎng)絡(luò)營銷、VI設(shè)計、網(wǎng)站改版、漏洞修補等服務(wù)。網(wǎng)站是否美觀、功能強大、用戶體驗好、性價比高、打開快等等,這些對于網(wǎng)站建設(shè)都非常重要,成都創(chuàng)新互聯(lián)通過對建站技術(shù)性的掌握、對創(chuàng)意設(shè)計的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。
記得一個技術(shù)主管說過這樣一個事情。他給一個程序員分配了PHP的開發(fā)任務(wù),沒想到那個程序員居然說:“我是學(xué)Java出身的,你讓我去寫 PHP,你這不是在貶低我嗎?”。這件事情給我印象很深、觸動也很大。雖然這不能代表大部分程序員的看法,但是這么認為的人應(yīng)該不少。還有人說,現(xiàn)在如果是大型的政府項目,PHP是肯定不會被列入考慮的范圍之內(nèi)的。
那么為什么PHPer會被認為是草根階層,是因為它很簡單,人人都可以學(xué)會,所以沒什么難度嗎?我以前也是這么認為。PHP入門很快,處理文件,數(shù)據(jù),遠程連接,網(wǎng)絡(luò)編程都非常方便,官方也有這樣的說法:PHP學(xué)習(xí)的成本很低,所以你容易去使用它。這個想法也是普遍的,甚至大部分的PHPer 自己都這樣認為。
說到這里,我想大家就會想到我為什么要寫這些文字。因為一年多的PHP推廣工作讓我了解到許許多多的使用PHP的公司的大概情況。在這些過程中我慢慢體會到其中的根本原因。這里我說是根本原因雖然是個人的看法,但是我覺得事實就是如此。
那么為什么PHPer會被看成草根階層,根本原因是PHPer所作的事情(通過代碼實現(xiàn))的絕大部分都是表現(xiàn)層的東西,這個熟悉PHP的人都知道。當(dāng)然也會有PHP會說他用MVC結(jié)構(gòu)編寫的某某框架具備的如何如何的功能。但是這些還是表現(xiàn)層。所以只會處理表現(xiàn)層的程序員就被看成草根階層了。事實上也是如此,因為這種情況下PHP確實很難構(gòu)造大型的應(yīng)用。
這就找到原因了,不是的。為什么PHPer總是在負責(zé)表現(xiàn)層的東西呢。答案是底層的數(shù)據(jù)處理(Web應(yīng)用就是數(shù)據(jù)存儲和查找)我們一般不去觸及。好,那么說到這里有些人可能已經(jīng)想到了,那不就是數(shù)據(jù)庫嗎?對,就是數(shù)據(jù)庫。讓PHPer一直當(dāng)草根的元兇就是數(shù)據(jù)庫。為什么?
PHPer對MySQL的依賴過大
因為目前流行的web架構(gòu)中,前端是負載均衡系統(tǒng),中間是web服務(wù)器,后面是數(shù)據(jù)庫服務(wù)器。所以,大部分PHPer工作在Web服務(wù)器層面。因為數(shù)據(jù)庫已經(jīng)很好地為我們組織數(shù)據(jù)了。所以PHP中沒有太多的算法,而且大家潛意識下也覺得不需要,更何況會影響性能。
這種情況下,PHPer就成為了數(shù)據(jù)庫使用者,他總是在操作數(shù)據(jù)庫。而不是在做程序。一個最簡單的PHP腳本就是,連接數(shù)據(jù)庫,把數(shù)據(jù)取出來,然后用命令輸出到瀏覽器。整個過程不超過10行代碼。給人的感覺就是太簡單了。沒有任何技術(shù)含量。為什么了,因為數(shù)據(jù)處理部分都已經(jīng)被數(shù)據(jù)庫做完了。尤其是MySQL的使用。MySQL是免費的,所以大多數(shù)程序員可以自由地使用它,另外MySQL的速度夠快了,所以做個PHP應(yīng)用程序非常的簡單。這就相當(dāng)于給你槍以后你覺得沒有必要學(xué)習(xí)武功一樣。當(dāng)然,我不是說槍沒有武功好。而是說,槍的出現(xiàn),小孩都可以輕松便捷地殺人了。
我們再詳細說說為什么是數(shù)據(jù)庫。這里我說一個例子。我去過北京一家非常著名的網(wǎng)站,當(dāng)時我們還有一個比較資深的PHP程序員在那說些系統(tǒng)架構(gòu)的事情。我記得當(dāng)時那個程序員問大家一個數(shù)據(jù)結(jié)構(gòu)中的算法問題的時候,全場沒有一個人能答得出來(包括我)。然后那個程序員就開始給大家講些很基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)的東西了。讓我一下子回想到大學(xué)時候?qū)W的數(shù)據(jù)結(jié)構(gòu)課。而這些基礎(chǔ)的數(shù)據(jù)排序、查找、傳遞的問題在其他高級語言(比如C)是非常普遍的。但是在PHP沒有。PHPchina.com的論壇也有個板塊叫PHP的數(shù)據(jù)結(jié)構(gòu)和算法。這個板塊的帖子也是寥寥無幾。
說到這里,大家明白了吧?大部分PHPer僅僅處理表現(xiàn)層的東西,而在MySQL的便捷使用下,PHPer幾乎不用觸及任何數(shù)據(jù)結(jié)構(gòu)與算法的情況下完成大部分開發(fā)任務(wù),所以一個才有上面的,沒有一個PHP程序員能夠回答出那道數(shù)據(jù)結(jié)構(gòu)的問題,換成是C等語言,情況可能就大不相同了。是PHPer草根,才讓PHP顯得草根。
仔細回想下,目前網(wǎng)絡(luò)上大家討論的最多的是兩個方面的問題。一個是PHP的類的使用(處理過程的封裝),還有一個是開發(fā)框架問題。但是我們仔細分析的話,發(fā)現(xiàn)這些所謂的PHP中比較復(fù)雜的概念里面沒有數(shù)據(jù)處理。為什么,有數(shù)據(jù)庫。用一個Adodb或者PHP5的PDO就可以搞定了。真的搞定了嗎?不是,這些無非是在連接數(shù)據(jù)庫,沒有數(shù)據(jù)處理。所以PHPer似乎就沒有什么可以拿出臺面上的東西。
再說一個具體的代碼問題,無級分類。這個概念我想大家都不會陌生了吧。我見過兩種處理方式。第一個是地道的PHPer的處理方式,也是目前比較流行的。就是用數(shù)據(jù)庫來處理。而且字段很少,只需要加個父類的字段并加以判斷就行了。而且這個方法很實用。效率也高。但是這個不是數(shù)據(jù)處理的范疇了,而是數(shù)據(jù)庫的查找。
第二個是C程序員用PHP寫出來的,他把所有的分類信息都從數(shù)據(jù)庫取出來,然后用數(shù)據(jù)結(jié)構(gòu)算法進行排列分布,然后輸出。
這里我們不對這兩種方式的效率進行對比,我想大家都有各自的想法。但是我想說明一個問題,就是這兩種做法的本質(zhì)的區(qū)別。PHPer習(xí)慣性地用數(shù)據(jù)庫來處理,而且有很巧的處理方式,效率也很高。這種方式就是數(shù)據(jù)庫查詢。而第二種方法是比較有特點的。他認為數(shù)據(jù)庫就是存放數(shù)據(jù)的地方,具體的邏輯處理還要靠自己的邏輯。
因此,結(jié)論是第二種方法的使用者覺得自己強些,因為數(shù)據(jù)的邏輯是他組織的。并且覺得PHPer的那種做法無非就是會查詢數(shù)據(jù)庫罷了。所以他認為PHPer是草根級的,只懂得操作數(shù)據(jù)庫和排列頁面(smarty搞搞那種)。
讓數(shù)據(jù)庫回歸本職工作
說到這里,我想大家都已經(jīng)回憶了不少自己平時用PHP做開發(fā)的經(jīng)歷了吧,是否發(fā)現(xiàn)大家確實都在操作數(shù)據(jù)庫呢。
那么我們來討論下這個問題。數(shù)據(jù)庫不好嗎?為什么我一直用數(shù)據(jù)庫處理數(shù)據(jù)都沒有問題。我要說的是數(shù)據(jù)庫是有問題的,而且有很大的問題。當(dāng)然這里我并不是說不能用數(shù)據(jù)庫,也不是在貶低數(shù)據(jù)庫的性能。而是,我們沒有充分認識到數(shù)據(jù)庫所起到的作用。
我的想法源起于這樣一個事情,有一次一個網(wǎng)站的技術(shù)總監(jiān)問我,為什么他們的網(wǎng)站那么慢,要怎么辦。當(dāng)時,我的MSN里Zend總部的工程師正好在線,我就問他PHP響應(yīng)比較慢了,怎么辦?他當(dāng)時直接告訴我,是數(shù)據(jù)庫問題。肯定是數(shù)據(jù)庫沒有優(yōu)化設(shè)計好。所以,我沒有給那個技術(shù)總監(jiān)確切的答案了,因為他們的數(shù)據(jù)庫設(shè)計我們是不能涉及的。所以就給了大概的數(shù)據(jù)庫優(yōu)化的建議。這樣的事情屢次發(fā)生,我就開始懷疑,為什么Zend總部的工程師每次都跟我說是數(shù)據(jù)庫的問題呢,難道我們不能從PHP層面來解決這個問題嗎?答案是不能。因為PHP目前的運行速度已經(jīng)是很快了,通過Zend的性能分析也能看到一個用戶的點擊,PHP的運行時間只有10%不到,那PHP在干嗎?它在等。等數(shù)據(jù)庫的查詢結(jié)果。這個方面在目前的PHP產(chǎn)品中有了很大的提高,那就是 Caching和網(wǎng)頁靜態(tài)化兩個方案。
Caching可能大家會比較陌生,但是網(wǎng)頁靜態(tài)化現(xiàn)在連PHP產(chǎn)品的用戶都非常清楚了。速度快、容易被搜索到等等,好處不言而喻。開玩笑地說,現(xiàn)在網(wǎng)站的主頁實現(xiàn)網(wǎng)頁靜態(tài)化只需要硬盤足夠大。J至于Caching就比較復(fù)雜些,也是大多數(shù)PHPer感到頭疼的地方。甚至于有些人會用C來實現(xiàn)。因為Caching中的數(shù)據(jù)有效期驗證、查找、提取、更新等等都是比較難處理。當(dāng)然,也有人會用數(shù)據(jù)庫來處理 Caching問題。
所以,當(dāng)訪問量激增的時候,PHP架構(gòu)的網(wǎng)站會出現(xiàn)的很多問題都因數(shù)據(jù)庫而起。數(shù)據(jù)庫的同步問題還不算什么。關(guān)鍵是數(shù)據(jù)庫的響應(yīng)速度會有指數(shù)級的降低。這個問題我在10月23號LAMP發(fā)布會的時候問過MySQL的副總裁。他當(dāng)時也沒有給我比較完美的答案(這也我的意料之中),因為數(shù)據(jù)庫總會有瓶頸的,除非是神仙數(shù)據(jù)庫,哈哈!
這里有個題外話,LAMP大會的時候我跟Yahoo的一個技術(shù)高管聊的時候,我問他Yahoo在選擇MySQL還是Oracle的時候是怎么考慮,他的答案令我非常驚訝。他說大部分的時候我們是會用MySQL的,因為它的性能已經(jīng)達到我們的要求。但是什么時候我們會選用Oracle呢,就是當(dāng)我們需要存儲收費用戶的數(shù)據(jù)的時候。我就問為什么,難道Oracle比MySQL穩(wěn)定嗎?他說,這個倒沒有特別考慮。關(guān)鍵是如果使用Oracle的話,當(dāng)出現(xiàn)問題的時候我們可以找到負責(zé)人,Oracle會負責(zé)事故的處理,但是如果用MySQL的話,我們找誰去?
所以,我們對數(shù)據(jù)庫的看法應(yīng)該糾正過來,就是說數(shù)據(jù)庫不是萬能的。如果有實力的話自己開發(fā)數(shù)據(jù)庫。聽說Google就是那樣的。
那么我們怎么看待數(shù)據(jù)庫呢?我個人的理解是數(shù)據(jù)庫只是用來降低開發(fā)成本的手段。因為采用數(shù)據(jù)庫以后我們不需要考慮數(shù)據(jù)的存儲,尤其是排序和查找。但是這會帶來什么問題呢?就是當(dāng)業(yè)務(wù)膨脹的時候,數(shù)據(jù)庫就成為瓶頸了。這個時候問題就會非常棘手。因為這個是底層的數(shù)據(jù)處理。牽一發(fā)而動全身。
所以我認為正確的觀點是,數(shù)據(jù)庫是一個數(shù)據(jù)備份機。怎么理解,我們只需要保證數(shù)據(jù)的存儲有效性就行了。而這本來就是數(shù)據(jù)庫的核心功能,只不過因為數(shù)據(jù)庫的方便的排序等功能讓大家把過多的處理都交給數(shù)據(jù)庫來操作了。一個用戶的點擊PHP就把一大堆的任務(wù)交給數(shù)據(jù)庫,然后把結(jié)果排列下給用戶就完事了。這對數(shù)據(jù)庫是不公平的。也是因此大家開始抱怨數(shù)據(jù)庫的性能了。
針對這個觀點,我們再舉個例子,有一次我去拜訪一個大型的網(wǎng)絡(luò)公司(基本上國內(nèi)只要上過互聯(lián)網(wǎng)的都知道),他們使用PHP很少,但是我了解到他們其它業(yè)務(wù)是怎么使用數(shù)據(jù)庫。他們自豪地跟我介紹說他們在數(shù)據(jù)庫的外圍有個第二數(shù)據(jù)庫(我這里起名叫第二數(shù)據(jù)庫)。為什么叫第二數(shù)據(jù)庫呢,原來它是一個緩存系統(tǒng)。那么開發(fā)工程師怎么去這個緩存系統(tǒng)獲取數(shù)據(jù)呢?那個技術(shù)總監(jiān)自豪地說,他們這個緩存系統(tǒng)有SQL查詢語句。我當(dāng)時很驚訝,但是后來想想確實需要這個。因為當(dāng)你的緩存系統(tǒng)達到一定量級的時候從緩存獲取數(shù)據(jù)都非常復(fù)雜,干脆寫個SQL查詢語句讓緩存系統(tǒng)分析、處理并返回數(shù)據(jù)。而且他們告訴我,在他們那里,就算是用PHP的話也是讓PHP去那個緩存系統(tǒng)讀取數(shù)據(jù)。
所以說,如果你能處理好這樣的問題的話,把數(shù)據(jù)存放在數(shù)據(jù)庫,然后數(shù)據(jù)庫只起到備份的作用。然后你用自己的中間層來處理分析數(shù)據(jù),效果是90% 以上的用戶不訪問數(shù)據(jù)庫。有人就會說了,這不就類似連接池的東西嗎?是的,因為數(shù)據(jù)庫的瓶頸是無法解決的,我們只能在Web服務(wù)器和數(shù)據(jù)庫中間加個中間層來做緩沖。
可能大家會說了,切,這個我們早就知道了。那好,這里我要說的是它引發(fā)的兩點思考:
第一,有些語言已經(jīng)有連接池技術(shù)的基礎(chǔ)上,那些程序員可以方便地使用連接池而構(gòu)建大型應(yīng)用。那么如果他們認為 PHPer只會是用數(shù)據(jù)庫,那么我們是不是可以說他們只會是用連接池呢?連接池和數(shù)據(jù)庫在這個概念上有何區(qū)別?
第二,當(dāng)PHPer開始構(gòu)建自己的緩存系統(tǒng)的時候,他是不是突破了PHPer只會是用數(shù)據(jù)庫的層次?因為他參與了數(shù)據(jù)邏輯的處理工作。那么他還是草根嗎?
最后,懂得獨立思考的PHPer不是草根,什么事情都丟給數(shù)據(jù)庫去做的才是。
本文實例講述了php中目錄操作opendir()、readdir()及scandir()用法。分享給大家供大家參考,具體如下:
opendir(path,context)若成功,則該函數(shù)返回一個目錄流,否則返回
false
以及一個
error。可以通過在函數(shù)名前加上
“@”
來隱藏
error
的輸出。
readdir()
函數(shù)返回由
opendir()
打開的目錄句柄中的條目。若成功,則該函數(shù)返回一個文件名,否則返回
false。
scandir()
函數(shù)返回一個數(shù)組,其中包含指定路徑中的文件和目錄。
若成功,則返回一個數(shù)組,若失敗,則返回
false。如果
directory
不是目錄,則返回布爾值
false
付上2段搜到的讀取目錄的代碼,親測有效
顯示目錄中文件名
//
打開目錄,然后讀取其內(nèi)容
if
(is_dir($dir)){
if
($dh
=
opendir($dir)){
while
(($file
=
readdir($dh))
!==
false){
echo
"filename:"
.
$file
.
"br";
}
closedir($dh);
}
}
拷貝一個目錄的文件到另一個目錄
copy_dir($from_dir,$to_dir);
function
copy_dir($from_dir,$to_dir){
if(!is_dir($from_dir)){
return
false;
}
echo
"\r\n
from:",$from_dir,'---to',$to_dir;
$from_files
=
scandir($from_dir);
//如果不存在目標(biāo)目錄,則嘗試創(chuàng)建
if(!file_exists($to_dir)){
@mkdir($to_dir);
}
if(!empty($from_files)){
foreach
($from_files
as
$file){
if($file
==
'.'
||
$file
==
'..'
){
continue;
}
if(is_dir($from_dir.'/'.$file)){//如果是目錄,則調(diào)用自身
copy_dir($from_dir.'/'.$file,$to_dir.'/'.$file);
}else{//直接copy到目標(biāo)文件夾
copy($from_dir.'/'.$file,$to_dir.'/'.$file);
}
}
}
}
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP目錄操作技巧匯總》、《php文件操作總結(jié)》、《PHP常用遍歷算法與技巧總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計算法總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
您可能感興趣的文章:使用PHP函數(shù)scandir排除特定目錄PHP獲取當(dāng)前文件所在目錄
getcwd()函數(shù)php文件夾與文件目錄操作函數(shù)介紹php中判斷文件空目錄是否有讀寫權(quán)限的函數(shù)代碼PHP解析目錄路徑的3個函數(shù)總結(jié)PHP使用glob函數(shù)遍歷目錄或文件夾的方法php
file_exists
檢查文件或目錄是否存在的函數(shù)PHP遍歷目錄函數(shù)opendir()、readdir()、closedir()、rewinddir()總結(jié)PHP刪除非空目錄的函數(shù)代碼小結(jié)PHP目錄函數(shù)實現(xiàn)創(chuàng)建、讀取目錄教程實例php使用scandir()函數(shù)掃描指定目錄下所有文件示例
PHP程序員在面試的時候一般應(yīng)該抓住以下幾個點。
一、應(yīng)該介紹自己掌握的開發(fā)一種,主要介紹PHP語言的獨特語法以及如何使用,比如PHP語言會比CGI更快的執(zhí)行動態(tài)頁面。
二、必須熟悉Oracle、Mysql等數(shù)據(jù)庫,并能簡單的介紹自己掌握的程度。由于php做出的動態(tài)頁面比用其他語言做出來的頁面在執(zhí)行效率以及CGI方面高得多,所以你還需要在面試中說出自己的文檔撰寫能力很強。
三、PHP程序員應(yīng)該具備獨立分析和解決問題的能力,可以在自我介紹中講講自己曾經(jīng)遇到過的問題是如何解決的。讓面試官看到你的能力,這將會直接影響到你自我介紹的成功與否。
四、一個PHP程序員必須有良好的職業(yè)道德和工作態(tài)度,所以在面試中應(yīng)該盡量講自己在做項目時的認真態(tài)度以及今后的工作規(guī)劃,表現(xiàn)出自己的進取心。
五、還有關(guān)于溝通能力和理解能力的體現(xiàn),這個在與HR的交談中就可以表現(xiàn)出來,所以需要做的工作就是從容的有條理的把自我介紹說完,回答每一個問題時都應(yīng)該簡潔明了,關(guān)于自我介紹可以提前做個草稿,背一下。
六、團隊合作能力也是企業(yè)非常看重的,在培訓(xùn)中老師一般都會帶領(lǐng)大家做項目,大的項目一般會分小組,每個人都有相對應(yīng)的任務(wù),這就模擬了公司中的團隊合作,在自我介紹過程中要把做項目的具體流程以及相互協(xié)作的過程說出來,讓HR看到自己具備團隊合作的能力。
七、最后就是執(zhí)行力,每當(dāng)任務(wù)分配下來的時候該如何執(zhí)行,還有自己講過職業(yè)規(guī)劃后該如何執(zhí)行,還有在學(xué)習(xí)的過程中是如何人字形的,遇到困難又是如何執(zhí)行的,這些都可以體現(xiàn)出php程序員的執(zhí)行力,回答的時候抓住發(fā)現(xiàn)及時尋找原因,快速展開行動的這個主線即可。
八、最重要的是你的能力、技術(shù)以及自己的項目
網(wǎng)頁題目:php數(shù)據(jù)結(jié)構(gòu)與算法 php的數(shù)據(jù)類型分為哪三種
文章鏈接:http://chinadenli.net/article34/dohjope.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)頁設(shè)計公司、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)、靜態(tài)網(wǎng)站、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)