昨天晚上看新宸的ppt,發現一點和我以前的認識不同的地方。在DSO的多進程模式中,新宸提到apache的主進程會初始化所有的擴展模塊,然後fork出子進程,每個子進程再次初始化所有的擴展模塊一次。在我的印象中,模塊的初始化工作僅在主進程中雲運行一次,子進程是不會再做相同的操作。
做了一個擴展試驗了一下,發現的確如此,子進程是不會再次初始化擴展模塊的。
不過在和新宸一起做驗證的過程中發現了另一個比較好玩的事情,雖然子進程不做初試化功能,但是每個子進程都會執行擴展模塊的卸載邏輯。這個是我以前完全沒意識到的。在我的概念中,擴展模塊的初試化和卸載邏輯都是在主進程中完成的,沒子進程什麼事兒。
所以結論是:在DSO的多進程模式下,擴展模塊的MINI僅在主進程中執行一次,但MSHUTDOWN會在所有的子進程中都執行一次。
通過上述結論可以得到這麼一個注意事項:需要很小心的處理MSHUTDOWN內的邏輯,否則很容易發生在apache stop或者restart時發生core dump的現象。