最全的php記憶體溢出的解決方法
一.記憶體溢出解決方案
在做資料統計分析時,常常會遇到大數組,可能會發生記憶體溢出,這裡分享我的解決方案。還是用範例來說明這個問題,如下:
假定日誌中存放的記錄數為500000條,那麼解如下:
複製程式碼如下:
ini_set(‘memory_limit','64M'); //重置php可以使用的内存大小为64M,一般在远程主机上是不能修改php.ini文件的,只能通过程序设置。注:在safe_mode(安全模式)下,ini_set失效 set_time_limit(600);//设置超时限制为6分钟 $farr = $Uarr = $Marr = $IParr = $data = $_sub = array(); $spt = ”$@#!$”; $root = ”/Data/webapps/VisitLog”; $path = $dpath = $fpath = NULL; $path = $root.”/”.date(“Y-m”,$timestamp); $dpath = $path.”/”.date(“m-d”,$timestamp); for($j=0;$j<24;$j++){ $v = ($j < 10) ? ”0″.$j : $j; $gpath = $dpath.”/”.$v.”.php”; if(!file_exists($gpath)){ continue; } else { $arr = file($gpath);////将文件读入数组中 array_shift($arr);//移出第一个单元-》<?php exit;?> $farr = array_merge($farr,$arr); unset($arr); } } if(empty($this->farr)){ echo ”<p><center>没有相关记录!</center></p>”; exit; } while(!empty($farr)){ $_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000个 for($i=0,$scount=count($_sub);$i<$scount;$i++){ $arr = explode($spt,$_sub[$i]); $Uarr[] = $arr[1]; //vurl $Marr[] = $arr[2]; //vmark $IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP } unset($_sub);//用完及时销毁 } unset($farr);
這裡,不難看出,一方面,我們要增加PHP可用記憶體大小,另一方面,只要我們想辦法對數組進行分批處理,分而治之,將用過的變數及時銷毀(unset),一般是不會出現溢出問題的。
另外,為了節省PHP程式記憶體損耗,我們應盡可能減少靜態變數的使用,在需要資料重用時,可以考慮使用參考(&)。再一點就是:資料庫操作完成後,要馬上關閉連線;一個物件使用完,要及時呼叫析構函數(__destruct())。
二. unset銷毀變數並釋放記憶體問題
PHP的unset()函數用來清除、銷毀變量,不用的變量,我們可以用unset()將它銷毀。但某些時候,用unset()卻無法達到銷毀變 量所佔用的記憶體!我們先看一個例子:
複製代碼代碼如下:
<?php $s=str_repeat('1',255); //产生由255个1组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m-$mm; ?>
最後輸出unset()之前佔用內存減去unset()之後佔用內存,如果是正數,那麼說明unset($s)已經將$s從記憶體中銷毀(或者說,unset()之後記憶體佔用減少了),可是我在PHP5和windows平台下,得到的結果是:0。這是否可以說明,unset($s)並沒有起 到銷毀變數$s所佔用記憶體的作用?我們再作下面的例子:
複製程式碼如下:
<?php $s=str_repeat('1',256); //产生由256个1组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m-$mm; ?>
這個例子,和上面的例子幾乎相同,唯一的不同是,$s由256個1組成,即比第一個例子多了一個1,得到結果是:272。這是否可以說 明,unset($s)已經將$s所佔用的記憶體銷毀了?
透過上面兩個例子,我們可以得到以下結論:
結論一、unset()函數只能在變數值佔用記憶體空間超過256位元組時才會釋放記憶體空間。
那麼是不是只要變數值超過256,使用unset就可以釋放記憶體空間呢?我們再用一個例子來測試一下:
複製程式碼如下:
<?php $s=str_repeat('1',256); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); unset($s); //销毁$s $mm=memory_get_usage(); echo $p.'<br />'; echo $m-$mm; ?>
刷新頁面,我們看到第一行有256個1,第二行是0,照理說我們已經銷毀了$s,而$p只是引用$s的變量,應該是沒有內容了,另外,unset($s)前後內存佔用沒變化!現在我們再做以下的例子:
複製程式碼如下:
<?php $s=str_repeat('1',256); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); $s=null; //设置$s为null $mm=memory_get_usage(); echo $p.'<br />'; echo $m-$mm; ?>
現在刷新頁面,我們看到,輸出$p已經是沒有內容了,unset( )前後記憶體佔用量之差是272,也就是已經清除了變數佔用的記憶體。本例的$s=null也可以換成unset(),如下:
複製程式碼如下:
<?php $s=str_repeat('1',256); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); unset($s); //销毁$s unset($p); $mm=memory_get_usage(); echo $p.'<br />'; echo $m-$mm; ?>
我們將$s和$p都使用unset()銷毀,這時再看記憶體佔用量之差也是272,說明這樣也可以釋放記憶體。那麼,我們可以得到另外一條結論:
結論二、只有當指向該變數的所有變數(如引用變數)都被銷毀後,才會釋放記憶體。
以上就是最全的php記憶體溢出的解決方法 的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。
