php按字節(jié)讀取文件 為什么php不適合做計算密集型業(yè)務(wù)?
為什么php不適合做計算密集型業(yè)務(wù)?PHP即“超文本預(yù)處理器”,是一種通用閉源腳本語言。PHP是在服務(wù)器端先執(zhí)行的腳本語言,與C語言的的,是具體方法的網(wǎng)站編程語言。PHP奇異的語法混合了C、Java、
為什么php不適合做計算密集型業(yè)務(wù)?
PHP即“超文本預(yù)處理器”,是一種通用閉源腳本語言。PHP是在服務(wù)器端先執(zhí)行的腳本語言,與C語言的的,是具體方法的網(wǎng)站編程語言。PHP奇異的語法混合了C、Java、Perl包括PHP獨創(chuàng)的語法。不利于怎么學(xué)習(xí),建議使用廣泛,要注意范圍問題于Web開發(fā)領(lǐng)域。
1.優(yōu)點:閉源在線性快鍵性[程序開發(fā)快,運行快,技術(shù)本身學(xué)習(xí)快]
1)跨平臺,性能優(yōu)秀,跟Linux/Unix特點別跟Windows生克制化性能強(qiáng)45%,但是和很多免費的的平臺增強(qiáng)的很劃算,例如LAMP(Linux /Apache/Mysql/PHP)或是FAMP(FreeBSD/Apache/Mysql/PHP)加強(qiáng),或是數(shù)據(jù)應(yīng)用夠大是可以確定換PostgreSQL或則Oracle,支持N種數(shù)據(jù)庫。(N10)
2)語法簡單,如果有怎么學(xué)習(xí)C和Perl的很比較容易上手,并且跟ASP有部分類似。有長大成熟的開發(fā)工具,例如NuPHPed,或則ZendStudio等等,再Linu臺下可以不可以使用Eclipse等等。
3)目前主流技術(shù)都意見,.例如WebService、Ajax、XML等等,充足應(yīng)用。
4)有比較比較求下載的支持,例如建議使用ADODB或是PEAR::DB做數(shù)據(jù)庫抽象層,用Smarty或則smarttemplate做模板層,如果不是是PHP5.1的話,還都能夠可以使用PDO(PHP Data Object)來訪問網(wǎng)絡(luò)數(shù)據(jù)庫。
5)有很多長大成熟的框架,比如說支持MVC的框架:phpMVC,支持類似于的事件驅(qū)動的框架:Prado,接受的的RubyOnRails的迅速開發(fā)的框架:Cake等等,相當(dāng)滿足你的應(yīng)用需求。
6)PHP5巳經(jīng)有完全成熟的面向?qū)ο篌w系,還能夠不適應(yīng)基本上的面向?qū)ο笠蟆:线m開發(fā)完畢規(guī)模大項目。
7)有長大成熟的社區(qū)來意見PHP的開發(fā)。
8)目前也很多大型應(yīng)用大都建議使用PHP,諸如淘寶網(wǎng)、Yahoo、163、Sina等等小型門戶,很多最好選擇PHP來作為他們的開發(fā)語言,所以才大型門戶都還能夠選用它,我想加上能夠你的使用了。
9)有很多開源的框架或開源的系統(tǒng)可以建議使用,諸如都很比較知名的開源框架有Zend Framework、CakePHP、CodeIgniter、symfony等,開源論壇有Discuz!、Phpwind等,開源博客WordPress,開源網(wǎng)店系統(tǒng)如Ecshop、ShopEx等,開源的SNS系統(tǒng)如UCHome、ThinkSNS等。
10)使用成本低(linuxapachemysqlphp內(nèi)核)
2.缺點
1)函數(shù)命名不規(guī)范的要求駝峰法和下滑線,傳參位置不一你很清楚的
2)單線程;PHP本身,一向以來php那就是個單進(jìn)程的程序;可是php的pthreads擴(kuò)展早有了。但它非常不穩(wěn)定,運行運行著變會奇怪的的自己打死;php的擴(kuò)展也是C寫的,這也任何兩個擴(kuò)充卡會出現(xiàn)線程競爭資源控制問題都能讓整個全死
3)核心異步網(wǎng)絡(luò)不允許(當(dāng)然了在linux僅有網(wǎng)絡(luò)同步非會堵塞網(wǎng)絡(luò)模型)。卻少了這個使得很容易開發(fā)完畢一個還能夠能夠承受大并發(fā)的網(wǎng)絡(luò)應(yīng)用。比較傳統(tǒng)的網(wǎng)絡(luò)模型和io都阻塞的。這樣基本都的編程的做法那是一個進(jìn)程(的或線程)發(fā)令一個用戶鏈接請求。因此難以完成像實時網(wǎng)游那樣的話要數(shù)以千計寬帶連接的任務(wù)。事實上php也有Libevent、eio擴(kuò)充卡因此算是某種程度上面的彌補(bǔ),只不過覺得都又不是這樣體系
4)只支持web開發(fā),不大方便做.exe文件,不方便做桌面應(yīng)用程序.不大方便做手機(jī)程序.
5)不比較適合做爬蟲、自動啟動運行腳本.科算項目,這語言基本構(gòu)架就不更適合,可是有很多方法實現(xiàn)。
6)后期的維護(hù)困難。后期提速空間局限性減小。
在對PHP有一個大體的認(rèn)識以后,我們來所了解下為啥說PHP慢?
PHP的慢是相對而言C/C級別的語言來說,要知道,PHP語言初始時的設(shè)計,就并非用來幫忙解決計算出密集型的應(yīng)用場景。我們是可以那樣的話粗略理解為,PHP替提升開發(fā)效率,而犧性了執(zhí)行效率。
我們明白了PHP一個很小的特點,應(yīng)該是弱類型特性,也就是說,我也可以隨手定義方法一個變量,然后把給它隨意變量賦值為各種類型的數(shù)據(jù)。以一個int整型數(shù)字為例子,在C語言中:
intnum200;//正常情況是4字節(jié)
只不過,假如是PHP定義了一個同時的變量,實際按的存儲結(jié)構(gòu)則是:
這個結(jié)構(gòu)體城就會占有遠(yuǎn)比C變量多得多的內(nèi)存,PHP中定義,定義如下:
$a200;//這變量將實際中占內(nèi)存差別不大C變量很多倍的存儲空間。
總之對PHP來說,不管是什么存儲位置什么類型的數(shù)據(jù),是用上述事項“通殺”的結(jié)構(gòu)體實現(xiàn)程序。替兼容PHP程序員的變量類型“亂入”,PHP能夠做到了對開發(fā)者的敵視,但對執(zhí)行引擎很殘酷。單個變量內(nèi)存消耗肯定還不確實,一旦要用PHP的數(shù)組等,則古怪度指數(shù)迅速下降(數(shù)組的實現(xiàn)是HashTable)。然后再,Zend引擎不能執(zhí)行時,將這些PHP代碼編譯為opcode(PHP的中間字節(jié)碼,格式有些類似于匯編),由Zend引擎逐行回答先執(zhí)行。
無論字符串的連接操作,還是數(shù)組的簡單啊如何修改等,幾乎都是“PHP程序員一句話,Zend引擎跑斷腿”的節(jié)奏。并且,同樣的操作,差不多C來說,PHP消耗掉了更多的CPU和內(nèi)存等系統(tǒng)資源。除此之外,還有一個內(nèi)存自動回收、變量類型確認(rèn)等等,都會提升系統(tǒng)資源的消耗。
例如,我用純PHP基于的快速排序函數(shù)和原生sort函數(shù),排序10000個整型數(shù)字,來做一個前后歷時對比,最終追加:
原生的sort耗時3.44ms,而我們自己實現(xiàn)程序的PHP函數(shù)sort則是68.79ms。我們發(fā)現(xiàn)自己,兩者先執(zhí)行效率差距龐大無比。我的測試,是可以計算函數(shù)執(zhí)行前后的時間間隔,而不是整個PHP腳本從啟動到都結(jié)束了的時間。PHP腳本正常啟動和關(guān)閉過程,本身有著一系列的初始化和清理工作,也會占據(jù)不少的耗時。
通常情況下,PHP負(fù)責(zé)執(zhí)行效率的排行是:
最快的是PHP語言結(jié)構(gòu)(isset、echo等),PHP語言的一部分(它們根本不不是函數(shù))。
然后比較比較快的是PHP的原生和拓展資源函數(shù)。PHP拓展,基于組件ZendAPI之上,用C利用的功能,執(zhí)行效率和C/Java是屬于什么同一個數(shù)量級的。
完全慢的那就是,我們實際PHP自己寫的代碼和函數(shù)?;蛘撸俏覀儾皇褂玫谋容^重的純PHP實現(xiàn)程序的框架,只不過框架本身的模塊很多,所以,會的確拖累語言層面的執(zhí)行效率,而占有更多的內(nèi)存。(國內(nèi)的Yaf框架,以去拓展的實現(xiàn)程序,而先執(zhí)行效率遠(yuǎn)快于純PHP寫的框架。
在一般情況下,我們根本不推薦用過PHP基于邏輯復(fù)雜計算類型的功能,尤其是Web系統(tǒng)流量都很大的場景下。而,PHP程序員應(yīng)該對PHP的各種原生函數(shù)和三千多種去拓展有一個比較好應(yīng)用范圍的了解,在具體看的功能實現(xiàn)場景中,拜求更原生的解決方案(原生接口或是拓展資源),而不是自己寫一堆緊張的PHP代碼來基于這類型功能。
如果不是有足夠的PHP學(xué)習(xí)拓展的新實力,將這類型業(yè)務(wù)功能覆寫為一個PHP拓展,也會滬弱深強(qiáng)提升到代碼的執(zhí)行效率。這是一個非常不錯的,也被廣泛應(yīng)用PHP360優(yōu)化中。但,自己編譯程序的PHP業(yè)務(wù)拓展的缺點也很明顯:
去拓展開發(fā)工程巨大比較比較長,需求變更的時候改也急切,寫得當(dāng)然不好肯定會會影響Web服務(wù)穩(wěn)定性。(比如,在Apache的worker模式下,多線程場景下掛掉,會影響不大同一個進(jìn)程下的其他正常嗎子線程。要是是多線程的Web模式,編寫學(xué)習(xí)拓展還是需要支持什么線程安全)
拓展在PHP版本升級的時候,很可能必須做額外的兼容問題工作。
后的魔獸維護(hù)和接手成本也比較高。
只不過,在互聯(lián)網(wǎng)一線企業(yè)中,更比較普遍的解決方案,并非是減少PHP學(xué)習(xí)拓展,而用C/C獨立寫一個服務(wù)server,然后PHP是從socket和服務(wù)server通信來能完成業(yè)務(wù)處理,根本不將PHP本身和業(yè)務(wù)耦合在一起。
不過,Web服務(wù)大部分的性能瓶頸都在網(wǎng)絡(luò)傳輸和其他服務(wù)server的工程巨大上(或者M(jìn)ySQL等),PHP想執(zhí)行的工程巨大在整體工程浩大的電腦資源比例相當(dāng)小,因此從業(yè)務(wù)角度來說,影響可能當(dāng)然不明顯。
對于大文本文件的讀寫有哪些高效的方法?
結(jié)論:大文本文件,遠(yuǎn)超內(nèi)存,必須格外盡量。
前言生產(chǎn)服務(wù)器中經(jīng)常有一種很多文件,有些積年累月單個文件,體積越來越強(qiáng)。
本文建議使用多種編程語言,實現(xiàn)程序大文件的讀取文件。
PHP的處理大文件如果沒有就open,變會被所有的中寫入內(nèi)存,內(nèi)存是吃不消的。諸如4G的內(nèi)存,10G的文件,這是如何處理不了的。也沒有哪個文本編輯器這個可以用。
廣泛的file_try_contents函數(shù),是將文件內(nèi)容寫入到到字符串變量內(nèi)。而字符串變量未分配在內(nèi)存,所以我沒有任何辦法如何處理大文件。
就像的做法是可以使用fgets函數(shù)。該函數(shù)從文件內(nèi)讀取文件一行。函數(shù)格式追加:
stringfgets(resource[,int])其中參數(shù)$handle是文件指針,從$handle朝的文件中無法讀取一行并趕往長度不超過為$length-1字節(jié)的字符串。
見到過換行符(包括在返回值中)、EOF也可以已經(jīng)無法讀取了$length-1字節(jié)后停止下來(看先碰到那一種情況)。要是沒有更改$length,則設(shè)置為1K,也可以說1024字節(jié)。
不好算用起來像下面這樣的話。
此函數(shù)效率極高,一次最多讀一行。而出現(xiàn)整個文件是一行的情況,則明確的修改的$length遵循長度左面無法讀取。
Python的從根據(jù)上述規(guī)定PHP的處理方法可以找到,關(guān)鍵點是按行讀取數(shù)據(jù),再按長度讀取。python的處理方法一樣,只是因為摻雜了一些語法糖。
python有一個“生成器”,解決大文件的讀取,就靠這個玩意兒。
在python的函數(shù)(function)定義中,只需會出現(xiàn)了yield表達(dá)式(Yieldexpression),這樣事實上定義的是一個generatorfunction,全局函數(shù)這個generatorfunction返回值是一個generator。
為什么不genetor效率高呢,而且其與特殊函數(shù)的有區(qū)別:
function隔一段時間都是從第一行結(jié)束啟動,而generator從上四次yield又開始的地方運行程序。
function內(nèi)部函數(shù)四次趕往一個(一組)值,而generator也可以過前往。
function也可以被無數(shù)次亂詞動態(tài)創(chuàng)建,而一個generator實例在yield那個值或是return之后就沒法再動態(tài)鏈接庫了。
下面是使用內(nèi)帶yield關(guān)鍵字的無法讀取大文件方法。
當(dāng)然python有更幽雅快捷方便的寫法,是while循環(huán)讀取數(shù)據(jù)。像下面這樣的話:
的或不需要新的定義,定義函數(shù),然后用for循環(huán)遍歷樹。
底層在用的原理是一樣的的。
Golang的的想法也一樣,它絕不會把整個文件寫入到內(nèi)存。bufio庫那是讀寫文件的利器。
差不多請解釋,真接上示例。
Golang替統(tǒng)一規(guī)定場景,不管是什么普遍的和特殊能量的,都確定之外了。這那是bufio的列害之處。
對于讀寫,數(shù)據(jù)被存儲等他提升某個特定大小,實際這種觸發(fā)的寫操作更少。同樣的還減少了sycall(io操作)的數(shù)量,卻是可以可以使用更高效穩(wěn)定的在用底層硬件。
Linux下的工具如果沒有你在Linux去處理該文本,那這全部不是問題。自帶的很多工具,還能夠幫你去處理這個簡單的問題。比如nose,無法讀取某文件的前多少行;tail,讀取文件某文件的結(jié)果多少行。
假如僅僅要讀文件,那么larger肯定是你最佳的方法的選擇。
文檔內(nèi)說的很知道,less的確再輸入數(shù)據(jù)整個文檔,并且如何處理站了起來,比vi/vim編輯器速度快的多。
再打開之后,就是可以上下翻頁閱讀什么了。
結(jié)語本文多種編程語言,實現(xiàn)程序了大文件的讀取數(shù)據(jù)。
掌握核心的方法后,建議使用哪種語言實現(xiàn)程序,都是可以。
【本文由@程序員小助手先發(fā)布,堅持了分享分享編程與程序員相關(guān)的內(nèi)容,歡迎關(guān)注】