使用FGETS()或FREAD()來(lái)處理大文件,或在塊中進(jìn)行塊,而不是使用文件()或file_get_contents()將整個(gè)文件加載到內(nèi)存中。 2。通過(guò)避免鍊式的字符串功能,分解操作以及完成大字符串上的unset(),從而最大程度地減少不必要的字符串副本。 3.使用具有屈服的發(fā)電機(jī)來(lái)迭代數(shù)據(jù),而無(wú)需在內(nèi)存中存儲(chǔ)大型數(shù)組。 4。除非需要多鍵型支持,否則優(yōu)先使用UTF-8編碼,在存在時(shí)脫帶BOM,並使用二進(jìn)制安全功能。 5。使用php://輸入,管道或splfileObject作為流以從一開(kāi)始的有效處理,將輸入視為流。 6。使用MOMERY_GET_USAGE()監(jiān)視內(nèi)存使用量,在php.ini中設(shè)置適當(dāng)?shù)膬?nèi)存限制,並考慮批處理處理或子進(jìn)程以隔離內(nèi)存。通過(guò)逐步處理數(shù)據(jù)並避免完整的內(nèi)存存儲(chǔ),PHP可以有效地處理具有可預(yù)測(cè)的內(nèi)存消耗的大型文本工作負(fù)載。
在處理PHP中的大型數(shù)據(jù)集時(shí),例如解析多Gigabyte日誌文件,CSV或處理文本流 - 如果您不小心,記憶使用情況可能會(huì)迅速失控。默認(rèn)情況下,PHP中的字符串不是內(nèi)存有效的,尤其是當(dāng)完全加載到內(nèi)存中時(shí)。這是如何有效地處理弦處理的方法,而無(wú)需用盡RAM。

1。塊中的過(guò)程數(shù)據(jù),不是一次
最常見(jiàn)的錯(cuò)誤是使用file()
或file_get_contents()
之類的函數(shù)將整個(gè)文件加載到內(nèi)存中。對(duì)於2GB文件,這將在內(nèi)存中創(chuàng)建一個(gè)2GB字符串(Plus開(kāi)銷),超出了PHP的內(nèi)存限制。
相反,請(qǐng)閱讀並處理逐條線或可管理的塊中的文件:

$ handle = fopen('groun_file.txt','r'); 如果($ hander){ while(($ line = fgets($ hander))!== false){ //一次處理一行 過(guò)程線($ line); } fclose($ handle); }
無(wú)論文件大小如何,這都可以使內(nèi)存使用量保持恆定。
?將
fgets()
用於基於線路的數(shù)據(jù)(日誌,CSV)或具有固定緩衝尺寸(例如8KB)的fread()
,用於二進(jìn)製或非線內(nèi)容。
2。避免創(chuàng)建不必要的字符串副本
PHP的“寫入抄寫”機(jī)制有助於延遲重複。一旦修改了字符串,PHP可能會(huì)創(chuàng)建完整的副本。對(duì)產(chǎn)生中間字符串的操作保持謹(jǐn)慎:
//風(fēng)險(xiǎn):創(chuàng)建許多臨時(shí)字符串 $ CLAIN = TRIM(strtolater(str_replace('','',$ input))); //更好:在可能的情況下使用流或原地邏輯 //或至少在完成後將其分解並取消
對(duì)於重大文本轉(zhuǎn)換,請(qǐng)考慮:
- 將REGEX與
preg_replace_callback()
一起使用,並且處理以增量匹配。 - 完成後,重複使用變量並在大字符串上調(diào)用
unset()
。 - 除非絕對(duì)必要,否則避免在大量字符串上避免使用
array_map
。
3。使用發(fā)電機(jī)進(jìn)行內(nèi)存安全迭代
發(fā)電機(jī)允許您一次產(chǎn)生一個(gè)處理的字符串,而無(wú)需構(gòu)建大型陣列:
功能讀?。? file){ $ handle = fopen($ file,'r'); 如果(!$ handle)返回; while(($ line = fgets($ hander))!== false){ 產(chǎn)生$ line; //一次只有一行在內(nèi)存中 } fclose($ handle); } foreach(readlines('buge_file.log')為$ line { if(strpos($ line,'error')!== false){ Echo $ line; } }
這樣,即使您要過(guò)濾或轉(zhuǎn)換數(shù)千條線,內(nèi)存也保持平坦。
4。選擇正確的數(shù)據(jù)格式和編碼
- 如果可能的話,請(qǐng)避免使用UTF-16或重型文件- PHP處理UTF-8最好,並且額外的編碼層會(huì)增加內(nèi)存和處理成本。
- 如果需要,請(qǐng)手動(dòng)脫衣:
if(substr($ line,0,3)===“ \ xef \ xbb \ xbf”){ $ line = substr($ line,3); }
- 除非確實(shí)需要多重支持,否則使用二進(jìn)制安全函數(shù)(
substr
,strpos
),而不是mb_*
,mbstring
功能較慢且內(nèi)存較大。
5。使用php://input
,管道或SplFileObject
進(jìn)行流處理
為了提高效率,請(qǐng)從一開(kāi)始就將輸入視為流:
$ input = fopen('php:// input','r'); //非常適合大型帖子數(shù)據(jù) $ output = fopen('php:// output','w'); while($ chunk = fread($ input,8192)){ $ processed = transformChunk($塊); fwrite($輸出,$處理); }
或使用SplFileObject
進(jìn)行內(nèi)置迭代的面向?qū)ο蟮?,可尋求的文件訪問(wèn)。
6。監(jiān)視和限制內(nèi)存使用
即使有良好的做法,也會(huì)發(fā)生錯(cuò)誤。設(shè)置限制並監(jiān)視:
迴聲'當(dāng)前內(nèi)存使用情況:'。 memory_get_usage() / 1024 /1024。 'MB'。 php_eol;
明智地使用php.ini
中的memory_limit
- 有時(shí)讓PHP快要失敗比掛起更好。
另外,考慮在批處理或產(chǎn)卵過(guò)程中處理以隔離,可重複的記憶上下文。
基本上,關(guān)鍵是永遠(yuǎn)不要假設(shè)您可以適合RAM中的所有內(nèi)容。像河流一樣對(duì)待大琴弦 - 在流動(dòng)時(shí)進(jìn)行過(guò)程,不要試圖存儲(chǔ)海洋。借助閱讀量的塊,生成器和正念的字符串處理,PHP可以處理出令人驚訝的大型文本工作負(fù)載,並有效地可預(yù)測(cè)。
以上是PHP中的大型數(shù)據(jù)集的存儲(chǔ)效率字符串處理的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

nullbytes(\ 0)cancauseunexpectedBehaviorInphpWhenInterfacingWithCextensOsSySycallsBecaUsectReats \ 0asastringTermInator,EventHoughPhpStringSareBinary-SaftringsareBinary-SafeanDeandSafeanDeandPresserve.2.infileperations.2.infileperations,filenamecontakecontakecontablescontakecontabternallikebybybytartslikeplikebybytrikeplinebybytrikeplike'''''''';

sprintf和vsprintf在PHP中提供高級(jí)字符串格式化功能,答案依次為:1.可通過(guò)%.2f控制浮點(diǎn)數(shù)精度、%d確保整數(shù)類型,並用d實(shí)現(xiàn)零填充;2.使用%1$s、%2$d等positional佔(zhàn)位符可固定變量位置,便於國(guó)際化;3.通過(guò)%-10s實(shí)現(xiàn)左對(duì)齊、]右對(duì)齊,適用於表格或日誌輸出;4.vsprintf支持?jǐn)?shù)組傳參,便於動(dòng)態(tài)生成SQL或消息模板;5.雖無(wú)原生命名佔(zhàn)位符,但可通過(guò)正則回調(diào)函數(shù)模擬{name}語(yǔ)法,或結(jié)合extract()使用關(guān)聯(lián)數(shù)組;6.應(yīng)通過(guò)substr_co

TodefendagainstXSSandinjectioninPHP:1.Alwaysescapeoutputusinghtmlspecialchars()forHTML,json_encode()forJavaScript,andurlencode()forURLs,dependingoncontext.2.Validateandsanitizeinputearlyusingfilter_var()withappropriatefilters,applywhitelistvalidation

PHP的PCRE函數(shù)支持高級(jí)正則功能,1.使用捕獲組()和非捕獲組(?:)分離匹配內(nèi)容並提升性能;2.利用正/負(fù)向先行斷言(?=)和(?!))及後發(fā)斷言(?

UTF-8處理在PHP中需手動(dòng)管理,因PHP默認(rèn)不支持Unicode;1.使用mbstring擴(kuò)展提供多字節(jié)安全函數(shù)如mb_strlen、mb_substr並顯式指定UTF-8編碼;2.確保數(shù)據(jù)庫(kù)連接使用utf8mb4字符集;3.通過(guò)HTTP頭和HTML元標(biāo)籤聲明UTF-8;4.文件讀寫時(shí)驗(yàn)證並轉(zhuǎn)換編碼;5.JSON處理前確保數(shù)據(jù)為UTF-8;6.利用mb_detect_encoding和iconv進(jìn)行編碼檢測(cè)與轉(zhuǎn)換;7.預(yù)防數(shù)據(jù)損壞優(yōu)於事後修復(fù),需在所有層級(jí)強(qiáng)制使用UTF-8以避免亂碼問(wèn)題。

Rawstringsindomain-drivenapplicationsshouldbereplacedwithvalueobjectstopreventbugsandimprovetypesafety;1.Usingrawstringsleadstoprimitiveobsession,whereinterchangeablestringtypescancausesubtlebugslikeargumentswapping;2.ValueobjectssuchasEmailAddressen

PHP的原生序列化比JSON更適合PHP內(nèi)部數(shù)據(jù)存儲(chǔ)與傳輸,1.因?yàn)樗鼙A敉暾麛?shù)據(jù)類型(如int、float、bool等);2.支持私有和受保護(hù)的對(duì)象屬性;3.可安全處理遞歸引用;4.反序列化時(shí)無(wú)需手動(dòng)類型轉(zhuǎn)換;5.在性能上通常優(yōu)於JSON;但不應(yīng)在跨語(yǔ)言場(chǎng)景使用,且絕不能對(duì)不可信輸入調(diào)用unserialize(),以免引發(fā)遠(yuǎn)程代碼執(zhí)行攻擊,推薦在僅限PHP環(huán)境且需高保真數(shù)據(jù)時(shí)使用。

角色級(jí)別的manipulationCanseverelyImpactperformanceInimmutable-stranguagesDuetorePeatEdeDallocations andCoppy; 1)避免使用repeatePeatedConcatenation = InvolyOps,而不是usemutablebufferslikelist''.join()inpythonorstringbuilderdringbuilderdercerinjava; 2)minimizizizizizin; 2)
