当前位置: 首页 > 面试题库 >

如果HTTP请求被取消/关闭,PHP将自动杀死脚本

岳硕
2023-03-14
问题内容

问题是,在很长的过程中,无论当前是否已连接客户端浏览器,PHP脚本都会继续执行。如果客户端终止了对脚本的Ajax调用,那么脚本是否也可能在服务器上终止?


问题答案:

正如@metadings指出的那样,php确实具有一个函数来检查连接中止,该连接名为connection_aborted()。如果连接终止,它将返回1,否则返回0。

在漫长的服务器端过程中,用户可能需要了解客户端是否与服务器断开连接或他已经关闭了浏览器,然后服务器才能安全地关闭该过程。

尤其是在应用程序使用php会话的情况下,如果即使客户端断开连接后,我们仍保持长时间运行,则服务器将对此会话无响应。来自同一客户端的任何其他请求都将等待,直到之前的进程完全执行。这种情况的原因是,进程运行时会话文件被锁定。但是,您可以专心地调用session_write_close()方法将其解锁。但这并非在所有情况下都是可行的,可能是需要在过程结束时向会话写一些东西。

现在,如果我们仅在循环中调用connection_aborted(),则无论连接是否关闭,它将始终返回0。

0表示连接不会中断。这是误导。但是,经过重新研究和实验,如果发现php 中的 输出缓冲区 是原因。

首先,为了检查是否中止,循环中的开发人员必须通过回显一些文本将一些输出发送到客户端。例如:

print " ";

由于该进程仍在运行,因此不会将输出发送到客户端。现在,要发送输出,我们需要刷新输出缓冲区。

flush ();
ob_flush ();

然后,如果我们检查是否中止,它将给出正确的结果。

if (connection_aborted () != 0) {
  die();
}

以下是工作示例,即使您正在使用PHP会话,这也将起作用:

session_start ();
ignore_user_abort ( TRUE );

file_put_contents ( "con-status.txt", "Process started..\n\n" );

for($i = 1; $i <= 15; $i ++) {

    print " ";

    file_put_contents ( "con-status.txt", "Running process unit $i \n", FILE_APPEND );
    sleep ( 1 );

    // Send output to client
    flush ();
    ob_flush ();

    // Check for connection abort
    if (connection_aborted () != 0) {
        file_put_contents ( "con-status.txt", "\nUser terminated the process", FILE_APPEND );
        die ();
    }

}

file_put_contents ( "con-status.txt", "\nAll units completed.",  FILE_APPEND );

编辑07-APR-2017

如果有人在Windows上使用Fast-Cgi,则当使用以下代码终止连接时,他实际上可以从内存中终止CGI线程:

if (connection_aborted () != 0) { apache_child_terminate(); exit; }



 类似资料:
  • 问题内容: 我正在制作网络爬虫。我将网址传递给搜寻器函数,并对其进行解析以获取锚标记中的所有链接,然后为所有这些网址使用相同的搜寻器函数,并对每个网址使用单独的goroutine。 但是,如果在我收到响应之前发送请求并取消它,则该特定请求的所有程序仍在运行。 现在我想要的是,当我取消请求时,由于该请求而被调用的所有goroutine都会停止。 请指导。 以下是我的 搜寻器 功能代码。 以下是我的P

  • 问题内容: 在生产环境中运行Express应用程序时,我想在服务器进程被杀死(即,发送SIGTERM或SIGINT)时正常关闭服务器。 这是我的代码的简化版本: 当我运行它并在浏览器中调用URL http:// localhost:3000 / 时,setInterval函数中的log语句将一直打印“当前打开1个连接”,直到我真正关闭浏览器窗口为止。显然,即使关闭选项卡也会使连接保持打开状态。 因

  • 问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其

  • 问题内容: 我有一个Python应用程序,该应用程序打开一个简单的TCP套接字以与单独主机上的另一个Python应用程序进行通信。有时程序会出错,或者我将直接杀死它,并且无论哪种情况,套接字都可能在未知的时间内保持打开状态。 下次我运行程序时,出现此错误: 现在,程序始终尝试使用相同的端口,因此看起来好像它仍处于打开状态。我检查了一下,很确定程序没有在后台运行,但是我的地址仍在使用中。 因此,如何

  • 问题内容: 有一个新的API用于从JavaScript发出请求:fetch()。是否有任何内置的机制可以在飞行中取消这些请求? 问题答案: 现在支持截至2017年9月20日的参数,但目前 并非所有浏览器都支持此参数 。 2020更新: 大多数主流浏览器(Edge,Firefox,Chrome,Safari,Opera和其他一些浏览器)都支持该功能,该功能已成为DOM生活标准的一部分。(截至2020

  • 本文向大家介绍php如何获取Http请求,包括了php如何获取Http请求的使用技巧和注意事项,需要的朋友参考一下 php获取Http请求的方法 $_SERVER介绍 $_SERVER是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。 获取Http请求的方法示例 实例补充: socket方式 使用套接字建立连接,拼接 HTTP