大伙都知道 php-cgi, php-cli下第一次运行PHP文件,都会比较慢,而且内存占用也异常的多,因为它需要做一些初始化工作,比如说解析php.ini。
我想不明白的是,为何内存占用在之后的运行中就恢复了正常水平,保持不变? 
还有,这部分内存保留的是什么内容? 为何在第二次运行时就被释放了?那么第一次运行PHP文件前不把它销毁?

解决方案 »

  1.   

    php-cgi是fastcgi进程吧, 跑起来加载一次配置文件就不退出了, 其实所有的php-cgi都bind在同一个地址上监听着呢,一般UNIX系统是用UNIX DOMAIN SOCKET,使用了setsockopt(SOL_SOCKET, SO_REUSEADDR);以便多php-cgi进程重复绑定在一个地址上(UNIX PATH相当于TCP/IP的同一个PORT上)。 然后所有php-cgi就开始循环accept了,至于是否使用了lock-accept-unlock防惊群咱没看过源码不乱说。php-cgi进程是apache启动的,这属于一个mod_fcgi模块(具体是不是这个名字不知道),何时启动呢? apache当得到一个完整的http request的时候,开始遍历所有module,调用每一个Module的回调,有一个mod就是fcgi了,apache做的事情就是创建一个socket,非阻塞connect到php-cgi监听的地址,根据connect后的errno判断当前是否还有空闲的fcgi进程,没有,那么再fork+exec启动一个Php-cgi,再次尝试connect就成功了。 connect上之后就要把http request的相关东西通过这个连接传输给php-cgi,于是php-cgi解析执行脚本完了结果通过连接回到apache,在下一轮apache事件轮询里mod_fcgi回调将响应应答结束,于是apache继续跑其他mod,直到所有Mod的回调都告知apache主框架已完成,那么apache整理所有http response完成应答。