PHP中的MINI的執行過程

      前幾天新宸分享了PHP Script的lifecycle, 由於那天需要參加公司的培訓,未去參加新宸的LifeCycle的分享。上一年有段時間很是癡迷於PHP的擴展,想弄清楚apache對PHP的擴展是如何調用和執行的。鑽研了好久,有了一個大致的概念,但沒有新宸這樣做一個比較清楚的總結,感謝新宸的ppt。
      昨天晚上看新宸的ppt,發現一點和我以前的認識不同的地方。在DSO的多進程模式中,新宸提到apache的主進程會初始化所有的擴展模塊,然後fork出子進程,每個子進程再次初始化所有的擴展模塊一次。在我的印象中,模塊的初始化工作僅在主進程中雲運行一次,子進程是不會再做相同的操作。
      做了一個擴展試驗了一下,發現的確如此,子進程是不會再次初始化擴展模塊的
      不過在和新宸一起做驗證的過程中發現了另一個比較好玩的事情,雖然子進程不做初試化功能,但是每個子進程都會執行擴展模塊的卸載邏輯。這個是我以前完全沒意識到的。在我的概念中,擴展模塊的初試化和卸載邏輯都是在主進程中完成的,沒子進程什麼事兒。
      所以結論是:在DSO的多進程模式下,擴展模塊的MINI僅在主進程中執行一次,但MSHUTDOWN會在所有的子進程中都執行一次。
     通過上述結論可以得到這麼一個注意事項:需要很小心的處理MSHUTDOWN內的邏輯,否則很容易發生在apache stop或者restart時發生core dump的現象。
發佈了45 篇原創文章 · 獲贊 4 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章