考察點:Java特性
第一點:
Java:JIT運行時編譯熱點代碼
PHP:具有opcache機制,能夠把腳本對應的opcode緩存在內存,PHP7中還支持配置opcache.file_cache導出opcode到文件
相關名詞解析:
JIT:(just-in-time compilation)狹義來說是當某段代碼即將第一次被執行時進行編譯,因而叫“即時編譯”。在運行時優化熱點代碼 把Java字節碼轉化成機器碼 。
OPCache緩存的機制:將編譯好的操作碼放入共享內存,提供給其他進程訪問。
第二點:
PHP的庫函數:用C實現
Java核心運行時的類庫(jdk/jre/lib/rt.jar,大於60MB):用Java編寫(jdk/src.zip),
Java應用運行的時候,用戶編寫的代碼以及引用的類庫和框架都要在JVM上解釋執行.對於 Java的HotSpot機制,直到有方法被執行10000次纔會觸發JIT編譯, 在此之前運行在解釋模式下,以避免出現JIT編譯花費的時間比方法解釋執行消耗的時間還要多的情況.
第三點:
PHP內置模板引擎,自身就是模板語言.
Java Web需要使用JSP容器如Tomcat或第三方模板引擎.
第四點:
PHP開發者不需要寫代碼參與進程和線程的管理
Java多線程編程需要Java開發者編碼參與.
PHP也可以運行在多線程模式下,比如Apache的event MPM和Facebook的HHVM都是多線程架構.不管是多進程還是多線程的PHP Web運行模式,都不需要PHP開發者關心和控制,也就是說PHP開發者不需要寫代碼參與進程和線程的管理,這些都由PHP-FPM/HHVM/Apache實現.PHP-FPM進程管理和併發實現並不需要PHP開發者關心,而Java多線程編程需要Java開發者編碼參與.
PHP一個worker進程崩潰,master進程會自動新建一個新的worker進程,並不會導致PHP服務崩潰.
而Java多線程編程稍有不慎(比如沒有捕獲異常)就會導致JVM崩潰退出.
對於PHP-FPM和Apache MOD_PHP來說,服務進程常駐內存,但一次請求釋放一次資源,這種內存釋放非常徹底. PHP基於引用計數的GC甚至都還沒發揮作用程序就已經結束了。