PHP:執行模型和記憶體模型

來源:互聯網
上載者:User
背景

對於任何一種語言,瞭解其執行模型和記憶體模型都是有意義的,本文中的內容不見得正確,請多批評。

執行模型

每個請求都是一個獨立的PHP進程,兩個請求之間會完全隔離,會話和Cookie是通過其他機制在多個請求之間實現資料共用,像靜態變數和全域屬性這些會在每個請求中重新初始化。

樣本

1 ';6 ?>

結果

2 //無論重新整理多少次請求,結果都是2。

記憶體模型 基本規則

以下是PHP的記憶體管理規則:

預設按值傳遞。 必須顯式的聲明按引用傳遞。 物件類型的值是對象的地址。

1 $symbol = value;

其中:symbo是符號,存放在符號表中(全域符號表或活動符號表),value是符號引用的值。

1 $symbol_ref = &$symbol;

其中:symbo_ref和symbo會l引用同一個值。

第一個小測試

代碼

 1 "10 11 ?>

結果

1 var_a:2, var_b:1, var_c:2, var_d:1, var_e:2

記憶體變化

第一步

第二步

第三步

第四步

第五步

第六步

第二個小測試

代碼

 1 value = $value; 7     } 8      9     function getValue() {10         return $this->value;    11     }12 }13 14 $var_obj = new TestClass();15 $var_obj_copy = $var_obj;16 $var_obj_ref = &$var_obj;17 18 $var_obj_ref->setValue(2);19 20 echo $var_obj->getValue().'
';21 echo $var_obj_copy->getValue().'
';22 echo $var_obj_ref->getValue().'
';23 ?>

結果

1 //輸出結果2 3 24 25 2

記憶體變化

第一步

第二步

第三步

第四步

備忘

真正的PHP記憶體不是上面那樣,但是語義上和上面描述的沒有區別,PHP為了最佳化記憶體做了一些額外的工作。

PHP為了提高記憶體利用效率,並不是在賦值給符號的時候立即按值拷貝的,每個值都維護了一個引用計數(被多少個符號引用了),在某些合適的時刻會自動拷貝,不過這些時刻對於開發人員是透明的,可以不用考慮。

有感興趣的朋友,可以參考這篇文章:http://www.laruence.com/2008/09/19/520.html。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.