http://www.voidcn.com/article/p-nqxqtsdq-btt.html
原文 https://stackoverflow.com/questions/19715048/what-gc-collect-cycles-function-is-useful-for
有人可以解釋什么情況下
gc_collect_cycles功能可以用嗎?應該在大量的內存利用率即將發生之前被調用?
默認情況下,PHP已啟用“垃圾收集器”.它用於釋放“垃圾”使用的內存.
gc_collect_cycles()強制收集任何現有的垃圾循環.它返回收集(釋放)循環的數量(對象,變量值…).啟用垃圾收集器不時調用此函數來釋放資源.在大多數情況下,PHP腳本生活的時間很短.在這種情況下,所有垃圾將在工作結束時被破壞,而不會收集任何垃圾.
gc_collect_cycles()強制收集任何現有的垃圾循環.它返回收集(釋放)循環的數量(對象,變量值…).啟用垃圾收集器不時調用此函數來釋放資源.在大多數情況下,PHP腳本生活的時間很短.在這種情況下,所有垃圾將在工作結束時被破壞,而不會收集任何垃圾.
有時需要手動管理GC:
> gc_disable()可以加快一些長時間的操作,但也會導致一些內存開銷.
> gc_collect_cycles()可用於指定GC的正確時刻.
另一個使用gc_collect_cycles()的原因 – 調試.假設你想知道memory_get_usage()的一些代碼塊的內存消耗是多少.您需要首先禁用GC,否則您會得到錯誤的結果.之后,您需要分離GC和應用程序所消耗的時間.所以調用gc_collect_cycles()並測量前后的時間/內存.
小例子
class A { public $ref; public $name; public function __construct($name) { $this->name = $name; echo($this->name.'->__construct();'.PHP_EOL); } public function __destruct() { echo($this->name.'->__destruct();'.PHP_EOL); } } gc_disable(); $a1 = new A('$a1'); $a2 = new A('$a2'); $a1->ref = $a2; $a2->ref = $a1; $b = new A('$b'); $b->ref = $a1; echo('$a1 = $a2 = $b = NULL;'.PHP_EOL); $a1 = $a2 = $b = NULL; echo('gc_collect_cycles();'.PHP_EOL); echo('// removed cycles: '.gc_collect_cycles().PHP_EOL); echo('exit();'.PHP_EOL);
會輸出:
$a1->__construct();
$a2->__construct(); $b->__construct(); $a1 = $a2 => $b = NULL; $b->__destruct(); gc_collect_cycles(); $a2->__destruct(); $a1->__destruct(); // removed cycles: 4
這意味着當被問及時,只有b $b被銷毀.其他$a1和$a2具有循環引用,它的名稱屬性也消耗內存.兩個對象兩個字符串= 4(由gc_collect_cycles()刪除).