2024 年 PHP 日本大会

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
'正在测试 PHP 中的连接处理';

// 运行一个无意义的循环,有时
// 希望会让我们点击离开
// 页面或点击“停止”按钮。
while(1)
{
// 连接是否失败?
if(connection_status() != CONNECTION_NORMAL)
{
break;
}

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

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

// 因此,我们可以在此处记录或执行任何其他任务
// 我们不需要实际依赖于
// 浏览器。
?>

备注

PHP 只有在尝试向客户端发送信息时才会检测到用户已中止连接。仅仅使用 echo 语句并不能保证信息被发送,参见 flush()

参见

添加备注

用户贡献的备注 4 个备注

57
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);
?>
29
lukas dot starecek at centrum dot cz
15 年前
匿名用户的评论并非完全有效。sleep 函数的时间不计入执行时间,因为 sleep 会延迟程序执行(参见 https://php.net/manual/en/function.sleep.php 及其评论)。我们对其进行了测试,这是事实。试试这个

<?php

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

?>

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

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

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

此外,如果您使用 set_time_limit(86400); 代替 set_time_limit(0);,您的脚本将在一天后停止。
3
Micke
9 年前
此函数似乎不适用于 IIS 服务器。

可以在 PHP Bug 跟踪系统中找到详细说明
https://bugs.php.net/bug.php?id=60586#1378935714
To Top