PHP內核與生命周期

jopen 12年前發布 | 2K 次閱讀

首先我們了解下php的執行流程、php生命周期。
     
二、php的執行流程
2.1 scanner
    
    將PHP代碼轉換為Tokens,詳見代碼Zend/zend_language_scanner.l。
       
2.2 parser
    
    將Tokens轉換成表達式,詳見代碼Zend/zend_language_parser.y。
       
2.3 compile
    
    將表達式編譯成opcode。opcode存放在op_array中。
       
2.4 execute
    
    Zend Engine調用zend_execute來執行op_array,輸出結果。


三、php的生命周期
3.1 STARTUP
    1、初始化引擎和核心組件。
    2、解析php.ini。
    3、初始化靜態構建的模塊(MINIT)。
    4、初始化共享模塊(MINIT)。
3.2 ACTIVATION
    1、初始化環境變量、變量。
    2、激活靜態構建的模塊(RINIT) 。
    3、激活共享模塊(RINIT) 。
    
3.3 RUNTIME
    
    1、編譯和執行php.ini中auto_prepend_file選項指定的文件。
    2、編譯和執行所請求的文件。
    3、編譯和執行php.ini中auto_append_file選項指定的文件。
    
3.4 DEACTIVATION
      
    1、調用用戶指定的退出函數。
    2、銷毀對象實例。
    3、停用模塊(RSHUTDOWN)。
    4、清空輸出。
    5、清理環境。
    6、釋放剩余的非持久內存。
3.5 SHUTDOWN
      
    1、關閉啟動的全部模塊(MSHUTDOWN)。

    2、關閉引擎。

再來看一下php 三個生命周期的一些申明與注意。 
  全局變量的全局變量周期,在頁面處理或程序關閉后則消失
  局部變量生命周期,主要是函數內部聲明的變量
  靜態變量聲明周期, 在函數第一次調用,并聲明了這個變量后產生,然后在程序執行前一直存在,知道程序結束。


  1. 對象聲明周期根據保存它實例的變量決定。


  2. php程序在頁面開始執行時建立所有的對象,在結束后摧毀這些變量, php沒有java,ROR這樣的應用程序池的概念,所以在建立對象和摧毀對象會影響一些性能,但是因為是生命期單一,所以很安全。


    4.析構函數不是必須的,php在一個頁面結束后會自動摧毀所有建立的資源。 如果你有特殊要求,比如對象加鎖,解鎖,是可以用析構函數處理的。


    5.垃圾收集。。 php頁面執行時間很短,最高也就30-60秒,垃圾收集效果并不明顯,而且實現垃圾收集還得進行內存堆掃描,所以一般來說沒有(不好意思,這塊我理解錯 誤,多虧群里的高手指引,是有引用計數來管理gc的。不過很多應用為了減少內存,手動對變量進行unset 也是常用的。。。。


  3. 常用的設計模式。 單例,工廠都可實現。通過php 的標準庫 SPL 也可以實現一些稍微復雜的設計模式, SPL引入了迭代器,對一些數組進行了類封裝。。使用SPL會讓php更OOP一些。。

    轉自:http://blog.csdn.net/h15811/article/details/7603374</span></strong>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!