PHP 有一個(gè)非常簡(jiǎn)單的垃圾收集器,它實(shí)際上將對(duì)不再位于內(nèi)存范圍(scope)中的對(duì)象進(jìn)行垃圾收集。垃圾收集的內(nèi)部方式是使用一個(gè)引用計(jì)數(shù)器,因此當(dāng)計(jì)數(shù)器達(dá)到 0 時(shí)(意味著對(duì)該對(duì)象的引用都不可用),對(duì)象將被當(dāng)作垃圾收集并從內(nèi)存中刪除。
每一種計(jì)算機(jī)語言都有自己的自動(dòng)垃圾回收機(jī)制,讓程序員不必過分關(guān)心程序內(nèi)存分配,php也不例外,但是在面向?qū)ο缶幊?OOP)編程中,有些對(duì)象需要顯式的銷毀;防止程序執(zhí)行內(nèi)存溢出。
一、PHP 垃圾回收機(jī)制(Garbage Collector 簡(jiǎn)稱GC)
在PHP中,沒有任何變量指向這個(gè)對(duì)象時(shí),這個(gè)對(duì)象就成為垃圾。PHP會(huì)將其在內(nèi)存中銷毀;這是PHP的GC垃圾處理機(jī)制,防止內(nèi)存溢出。
當(dāng)一個(gè)PHP線程結(jié)束時(shí),當(dāng)前占用的所有內(nèi)存空間都會(huì)被銷毀,當(dāng)前程序中所有對(duì)象同時(shí)被銷毀。GC進(jìn)程一般都跟著每起一個(gè)SESSION而開始運(yùn)行的.gc目的是為了在session文件過期以后自動(dòng)銷毀刪除這些文件.
二、__destruct /unset
__destruct() 析構(gòu)函數(shù),是在垃圾對(duì)象被回收時(shí)執(zhí)行。
unset 銷毀的是指向?qū)ο蟮淖兞浚皇沁@個(gè)對(duì)象。
三、 Session 與 GC
由于PHP的工作機(jī)制,它并沒有一個(gè)daemon線程來定期的掃描Session信息并判斷其是否失效,當(dāng)一個(gè)有效的請(qǐng)求發(fā)生時(shí),PHP 會(huì)根據(jù)全局變量 session.gc_probability和session.gc_divisor的值,來決定是否啟用一個(gè)GC, 在默認(rèn)情況下,session.gc_probability=1, session.gc_divisor =100也就是說有1%的可能性啟動(dòng)GC(也就是說100個(gè)請(qǐng)求中只有一個(gè)gc會(huì)伴隨100個(gè)中的某個(gè)請(qǐng)求而啟動(dòng)).
GC的工作就是掃描所有的Session信息,用當(dāng)前時(shí)間減去session最后修改的時(shí)間,同session.gc_maxlifetime參數(shù)進(jìn)行比較,如果生存時(shí)間超過gc_maxlifetime(默認(rèn)24分鐘),就將該session刪除。
但是,如果你Web服務(wù)器有多個(gè)站點(diǎn),多個(gè)站點(diǎn)時(shí),GC處理session可能會(huì)出現(xiàn)意想不到的結(jié)果,原因就是:GC在工作時(shí),并不會(huì)區(qū)分不同站點(diǎn)的session.
那么這個(gè)時(shí)候怎么解決呢?
1. 修改session.save_path,或使用session_save_path()讓每個(gè)站點(diǎn)的session保存到一個(gè)專用目錄,
2. 提供GC的啟動(dòng)率,自然,GC的啟動(dòng)率提高,系統(tǒng)的性能也會(huì)相應(yīng)減低,不推薦。
3. 在代碼中判斷當(dāng)前session的生存時(shí)間,利用session_destroy()刪除
php引用計(jì)數(shù)器進(jìn)行垃圾收集機(jī)制介紹
2020-01-12 17:41PHP教程網(wǎng) PHP教程
每一種計(jì)算機(jī)語言都有自己的自動(dòng)垃圾回收機(jī)制,讓程序員不必過分關(guān)心程序內(nèi)存分配,php也不例外,但是在面向?qū)ο缶幊?OOP)編程中,有些對(duì)象需要顯式的銷毀;防止程序執(zhí)行內(nèi)存溢出
延伸 · 閱讀
- 2022-03-10簡(jiǎn)單談?wù)刢entos7中配置php
- 2022-03-06Ubuntu14.04服務(wù)器環(huán)境下配置PHP7.0+Apache2+Mysql5.7的方
- 2022-03-05centos yum php 7.x 無需刪除升級(jí)的方法
- 2022-03-05Centos7下PHP安裝gd庫的實(shí)例講解
- 2022-03-03linux環(huán)境下安裝PHP的OpenSSL擴(kuò)展的方法講解
- 2022-03-02聊聊java中引用數(shù)據(jù)類型有哪些
- PHP教程
php htmlentities()函數(shù)的定義和用法
下面小編就為大家?guī)硪黄猵hp htmlentities()函數(shù)的定義和用法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧...
- PHP教程
php學(xué)習(xí)筆記 數(shù)組的常用函數(shù)
只要一個(gè)變量,需要在多個(gè)方法使用,就將這個(gè)變量聲明為成員屬性,可以直接在這個(gè)對(duì)象中的所有方法中使用 成員屬性,相當(dāng)于這個(gè)對(duì)象中的全局變量...
- PHP教程
PHP常量DIRECTORY_SEPARATOR原理及用法解析
這篇文章主要介紹了PHP常量DIRECTORY_SEPARATOR原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友...
- PHP教程
PHP中讀取文件的8種方法和代碼實(shí)例
這篇文章主要介紹了PHP中讀取文件的8種方法和代碼實(shí)例,本文總結(jié)了PHP中讀取文件的8個(gè)函數(shù),每一個(gè)都附有使用例子及注意事項(xiàng)等,需要的朋友可以參考下...
- PHP教程
php全角字符轉(zhuǎn)換為半角函數(shù)
這篇文章主要介紹了PHP全角半角轉(zhuǎn)換函數(shù),把目前能找到的所有全角都列出來了一個(gè)個(gè)替換吧,需要的朋友可以參考下 ...
- PHP教程
php學(xué)習(xí)之?dāng)?shù)據(jù)類型之間的轉(zhuǎn)換介紹
php學(xué)習(xí)之?dāng)?shù)據(jù)類型之間的轉(zhuǎn)換介紹,學(xué)習(xí)php的朋友可以參考下。 ...
- PHP教程
php實(shí)現(xiàn)的支持imagemagick及gd庫兩種處理的縮略圖生成類
這篇文章主要介紹了php實(shí)現(xiàn)的支持imagemagick及gd庫兩種處理的縮略圖生成類,包含了用法的詳細(xì)描述,非常實(shí)用,需要的朋友可以參考下...
- PHP教程
PHP變量的定義、可變變量、變量引用、銷毀方法
這篇文章主要介紹了PHP變量的定義、可變變量、變量引用、銷毀方法,需要的朋友可以參考下 ...