Press "Enter" to skip to content

Apache启动过程(PHP_MINIT_FUNCTION的调用)

信件内容,to eng-all;
Hi all:
上次我做的讲座中,讲到,PHP模块的MINIT_FUNCTION在多进程的环境下,会被调用多次,也就是,每个apache的自进程都会去调用一次。
今天早上的时候,学鹏经过实际验证发现事实不是这样。
于是经过反复验证 ,终于得出如下结论:
当Apache启动的时候,主进程会首先把所有模块load进来,然后又卸载掉 他们,这是第一遍,目的是为了检查配置文件。如果一切正常,Apache就会重新 load一便所有的模块,然后才fork子进程,这样,PHP模块就会只被初始化一次, 然后在fork的时候复制给子进程。
当apache关闭的时候 ,每个自进程都会去调用一次模块的关闭函数。
也就是说, PHP模块的初始化函数只会被调用一次,而关闭函数会被调用多次。
猜想是因为apache1.5x以后,做了优化,造成现在的这种机制,apache1.3应 该还是和我当时讲的一样。
最后,非常感谢学鹏的实际验证,没有实际验证,这个问题就不会被发现。
真正要了解一个东西,不应该只是听听就算,应该去动手验证一下,再次对学 鹏师兄表示,赞!

Yahoo惠新宸 xinchen.hui | Engineer| +86 659-86111 | Y! China

11 Comments

  1. shiran
    shiran August 13, 2012

    MINIT 相关的方法,是在PHP进程启动的时候执行,至于这个PHP进程执行多少次要看具体的Server(用fastcgi方法启动php 最明显)

  2. shiran
    shiran August 13, 2012

    MINIT 相关的方法,是在PHP进程启动的时候执行,至于这个PHP进程执行多少次要看具体的Server(用fastcgi方法启动php 最明显)

  3. 雪候鸟
    雪候鸟 June 18, 2012

    @istrone maybe是因为进程定时重启

  4. 雪候鸟
    雪候鸟 June 18, 2012

    @istrone maybe是因为进程定时重启

  5. istrone
    istrone June 18, 2012

    是不是模块的MINT会每隔一段时间被初始化一次呢?
    我写了一个简单的模块,想用它来统计PHP的所有的请求的次数,所以定义了一个属于模块的qr_count long类型变量,然后去掉了了init_globals函数的注释,然后在RINIT_FUNCTION,执行++QREQUEST_G(qr_count);在模块函数中获取 QREQUEST_G(qr_count)的值输出。
    但是,当qr_count加到一定程度或者间隔一段时间再次请求的时候,发现他归零了,这个会不会是最上边提到的原因呢?
    否则,这个会是什么原因呢?
    求解释……

  6. istrone
    istrone June 18, 2012

    是不是模块的MINT会每隔一段时间被初始化一次呢?
    我写了一个简单的模块,想用它来统计PHP的所有的请求的次数,所以定义了一个属于模块的qr_count long类型变量,然后去掉了了init_globals函数的注释,然后在RINIT_FUNCTION,执行++QREQUEST_G(qr_count);在模块函数中获取 QREQUEST_G(qr_count)的值输出。
    但是,当qr_count加到一定程度或者间隔一段时间再次请求的时候,发现他归零了,这个会不会是最上边提到的原因呢?
    否则,这个会是什么原因呢?
    求解释……

Comments are closed.