ignore_user_abort

(PHP 4, PHP 5, PHP 7, PHP 8)

ignore_user_abort设置客户端断开连接是否应中止脚本执行

描述

ignore_user_abort(?bool $enable = null): int

设置客户端断开连接是否应导致脚本中止。

当将 PHP 作为命令行脚本运行时,如果脚本的 tty 消失而脚本未终止,则脚本将在下次尝试写入任何内容时死亡,除非将 enable 设置为 true

参数

enable

如果设置且不为 null,则此函数将 ignore_user_abort ini 设置设置为给定的 enable。否则,此函数将只返回之前的设置,而不会更改它。

返回值

返回之前的设置,作为整数。

变更日志

版本 描述
8.0.0 enable 现在可以为空。

示例

示例 #1 ignore_user_abort() 示例

<?php
// 忽略用户中止并允许脚本
// 永久运行
ignore_user_abort(true);
set_time_limit(0);

echo
'Testing connection handling in PHP';

// 运行一个无用的循环,该循环有时
// 希望让我们从
// 页面或点击“停止”按钮。
while(1)
{
// 连接失败了吗?
if(connection_status() != CONNECTION_NORMAL)
{
break;
}

// 休眠 10 秒
sleep(10);
}

// 如果达到此位置,则“break”
// 是从 while 循环内部触发的

// 所以在这里我们可以记录或执行任何其他任务
// 我们需要,而实际上不依赖于
// 浏览器。
?>

注释

PHP 不会检测到用户已中止连接,直到尝试向客户端发送信息。简单地使用 echo 语句不能保证信息被发送,请参阅 flush().

参见

添加注释

用户贡献的注释 6 个注释

spiritual-coder at spiritual-coder dot com
18 年前
如果你想模拟一个 crontask,你必须调用这个脚本一次,它将一直运行(在服务器运行时)在后台,每隔指定的秒数 (= $interval) 做一些事情。

<?php
ignore_user_abort
(1); // 在后台运行脚本
set_time_limit(0); // 永远运行脚本
$interval=60*15; // 每 15 分钟执行一次...
do{
// 在这里添加每 15 分钟运行一次的脚本
// ...
sleep($interval); // 等待 15 分钟
}while(true);
?>
lukas dot starecek at centrum dot cz
14 年前
匿名用户的评论并不完全正确。sleep 函数的时间不会计入执行时间,因为 sleep 会延迟程序执行(参见 https://php.net/manual/en/function.sleep.php 和注释)。我们对此进行了测试,结果是正确的。尝试以下操作

<?php

set_time_limit
(2);
sleep(4);
echo
'hi!';
sleep(4);
echo
'bye bye!';

?>

这意味着,如果循环大部分时间都在休眠(在这种情况下很可能是这样),那么即使将时间限制设置为一天,这个脚本也可能会运行数月甚至数年。
Anonymous
15 年前
谨慎使用下面的 spiritual-coder 代码,除非你是高级用户,否则不要使用它。

首先,这样的代码如果没有跳出点,会导致服务器出现无限循环和幽灵线程。必须有一个技巧来跳出循环。

例如,你可以在循环中使用 if (file_exists(dirname(__FILE__)."stop.txt")) break;,这样如果创建了 "stop.txt",脚本就会停止执行。

另外,如果你使用 set_time_limit(86400); 而不是 set_time_limit(0);,你的脚本将在一天后停止运行。
Micke
9 年前
似乎这个函数对 IIS 服务器无效。

可以在 PHP 错误跟踪系统中找到详细说明
https://bugs.php.net/bug.php?id=60586#1378935714
Charlie Brown
9 年前
如果运行一个长时间的进程,并且浏览器经常关闭连接,那么使用这个函数。
plamen at pulsator dot com
23 年前
脚本应该向浏览器输出一些内容才能中止。如果没有任何输出,脚本将继续运行。
To Top