©
This document uses PHP Chinese website manual Release
(PHP 4 >= 4.0.5, PHP 5, PHP 7)
apache_child_terminate — 在本次请求结束后终止 apache 子进程
apache_child_terminate() 将把运行当前 PHP 请求的 Apache 子进程注册为终止状态,一旦结束 PHP 代码的运行此进程将终止。可以用在占用大量内存的脚本后面来终止该进程,因为通常内存只在内部释放而不会还给操作系统。
如果 PHP 以 Apache 1 模块方式运行,且 Apache
的版本是非多线程的,以及激活了 PHP 指令.
child_terminate,则返回
TRUE
。如果不满足上述条件则返回 FALSE
并生成一条
E_WARNING
级的错误信息。
版本 | 说明 |
---|---|
5.4.0 | 该函数目前也可以用于FastCGI模式了。以前,它仅在PHP作为Apapche的模块安装时支持。 |
Note: 此函数未在 Windows 平台下实现。
[#1] Stephan Ferraro [2010-08-11 02:39:06]
I found out a solution for Apache 2. However this works only without threads and only on POSIX compatible OS systems (e.g. Linux, OpenSolaris...).
<?php
// Terminate Apache 2 child process after request has been
// done by sending a SIGWINCH POSIX signal (28).
function kill_on_exit() {
posix_kill( getmypid(), 28 );
}
register_shutdown_function( 'kill_on_exit' );
?>
[#2] louis at ewens dot com [2008-01-29 16:29:33]
Apache child processes are greedy. If they get bloated by a PHP application that requires a lot of memory, they stay that way. The memory is never given back to the OS until that child dies.
You could use MaxRequestsPerChild in Apache to kill all child processes automatically after a certain number of connections. Or you can use apache_child_terminate to kill the child after your memory intensive functions.
Note: apache_child_terminate is not available in Apache 2.0 handler.
[#3] daniele_dll at yahoo dot it [2007-12-29 03:18:32]
In response to sam at liddicott dot com:
it isin't so simple! You should never kill an apache process because it is automatically freed when apache need!
And, if you use apache worker or thread based mpm you risk to kill the entire process!
result: DO NOT USE THIS FUNCTION!
[#4] admin at hostultra dot com [2007-12-06 08:43:11]
this code will add apache_child_terminate() function if it is not already present.
if (!function_exists("apache_child_terminate")){
function apache_child_terminate(){
register_shutdown_function("killonexit");
}
function killonexit(){
@exec("kill ".getmypid());
}
}