PHP內核與生命周期


首先我們了解下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 三個生命周期的一些申明與注意。 
  全局變量的全局變量周期,在頁面處理或程序關閉后則消失
  局部變量生命周期,主要是函數內部聲明的變量
  靜態變量聲明周期, 在函數第一次調用,並聲明了這個變量后產生,然后在程序執行前一直存在,知道程序結束。


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


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


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


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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM