二、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一些。。