Server記憶體管理機制
#Server啟動後記憶體管理的底層原理與普通php-cli程式一致。具體請參考Zend VM記憶體管理方面的文章。
局部變數 (建議學習中: 局部回調 使用者所有重複教學符號
#11163,所有事件「所有「」」影片回調。不需要unset。如果變數是資源類型,那麼對應的資源也會被PHP底層釋放。
function test() { $a = new Object; $b = fopen('/data/t.log', 'r+'); $c = new swoole_client(SWOOLE_SYNC); $d = new swoole_client(SWOOLE_SYNC); global $e; $e['client'] = $d; }
$a, $b, $c 都是局部變量,當此函數return時,這3個變數會立即釋放,對應的記憶體會立即釋放,開啟的IO資源檔案句柄會立即關閉。
$d 也是局部變量,但是return前將它保存到了全域變數$e,所以不會釋放。當執行unset($e['client'])時,並且沒有任何其他PHP變數仍然在引用$d變量,那麼$d就會被釋放。
全域變數
在PHP中,有3類全域變數。
使用global關鍵字宣告的變數
使用static關鍵字宣告的類別靜態變數、函數靜態變數
PHP的超全域變量,包含$_GET、$_POST 、$GLOBALS等
全域變數和對象,類別靜態變量,保存在Server物件上的變數不會被釋放。需要程式設計師自行處理這些變數和物件的銷毀工作。
class Test { static $array = array(); static $string = ''; } function onReceive($serv, $fd, $reactorId, $data) { Test::$array[] = $fd; Test::$string .= $data; }
在事件回呼函數中需要特別注意非局部變數的array型別值,某些操作如TestClass::$array[] = "string" 可能會造成記憶體洩漏,嚴重時可能會發生爆內存,必要時應注意清理大數組。
在事件回呼函數中,非局部變數的字串進行拼接操作是必須小心記憶體洩漏,如TestClass::$string .= $data,可能會有記憶體洩漏,嚴重時可能發生爆內存。
以上是swoole 記憶體會越來越大嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!