PHP Conference Japan 2024

apache_child_terminate

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

apache_child_terminate在此请求后终止Apache进程

描述

apache_child_terminate(): void

apache_child_terminate() 将注册执行当前PHP请求的Apache进程,以便在PHP代码执行完成后终止。它可用于在运行内存消耗高的脚本后终止进程,因为内存通常只会在内部释放,而不会返还给操作系统。

适用于Apache和FastCGI Web服务器。

参数

此函数没有参数。

返回值

不返回任何值。

备注

注意: 此函数在Windows平台上未实现。

参见

  • exit() - 使用状态码或消息终止当前脚本

添加备注

用户贡献的注释 5 个注释

Stephan Ferraro
14 年前
我找到了适用于 Apache 2 的解决方案。但是,这仅在没有线程且仅在兼容 POSIX 的操作系统(例如 Linux、OpenSolaris...)上有效。

<?php

// 在请求完成后通过发送 SIGWINCH POSIX 信号 (28) 来终止 Apache 2 子进程。
function kill_on_exit() {
posix_kill( getmypid(), 28 );
}

register_shutdown_function( 'kill_on_exit' );

?>
jasonlester at nope dot com
1 年前
在 FastCGI SAPI 中,这不会终止进程,它只是使 fastcgi 处理程序在脚本结束时完全回收 PHP,而不仅仅是回收请求状态。这包括 php-cgi。
louis at ewens dot com
16 年前
Apache 子进程很贪婪。如果它们被需要大量内存的 PHP 应用程序膨胀,它们就会保持这种状态。在子进程死亡之前,内存永远不会返回给操作系统。

您可以使用 Apache 中的 MaxRequestsPerChild 自动在一定数量的连接后终止所有子进程。或者您可以使用 apache_child_terminate 在您的内存密集型函数之后终止子进程。

注意:在 Apache 2.0 处理程序中不可用 apache_child_terminate。
daniele_dll at yahoo dot it
16 年前
回复 sam at liddicott dot com

没那么简单!您永远不应该终止 Apache 进程,因为 Apache 需要时会自动释放!

而且,如果您使用基于 Apache worker 或线程的 MPM,您可能会终止整个进程!

结果:不要使用此函数!
admin at hostultra dot com
16 年前
此代码将在该函数不存在时添加 apache_child_terminate() 函数。

if (!function_exists("apache_child_terminate")){
function apache_child_terminate(){
register_shutdown_function("killonexit");
}

function killonexit(){
@exec("kill ".getmypid());
}
}
To Top