0

我最近通过 chrome 执行了一个 mysql 查询并将其关闭。浏览器究竟是如何使用停止按钮停止 PHP 脚本的?我认为 PHP 是一种服务器端语言,无法通过客户端进行控制。

*更新*我现在知道了SHOW PROCESSLIST,但这只会显示哪些线程正在运行。是否有一个 SQL 命令可以用来查看执行的查询的详细信息?

4

6 回答 6

1

客户端 (Chrome) 与在服务器上执行脚本 (PHP) 无关,而服务器又无法控制数据库进程(MySQL 查询)。

查看您的服务器进程列表以了解一般情况(Apache 进程)。

甚至更好:SHOW PROCESSLIST;在 MySQL 控制台上使用来查找长时间运行的查询。您可以使用 退出它KILL ###ID_OF_QUERY###;

于 2013-01-09T13:46:05.167 回答
1

不,您不需要保持打开状态。如果您退出正在行驶的汽车,汽车会熄火吗?不。

对不起,这有点流鼻涕,但也不是故意的。

浏览器(在您的情况下为 Chrome)实际上并未运行实际代码。服务器是。因此,一旦执行了指令,关闭浏览器就不再重要了,因为请求已经发送给了服务器。

于 2013-01-09T13:46:11.777 回答
0

两个函数对于执行耗时的 php 脚本是必不可少的。它与浏览器无关(正如其他用户已经指出的那样)

查找ignore_user_abortset_time_limit

于 2013-01-09T13:46:52.847 回答
0

无论浏览器关闭,脚本都会继续执行。您可以通过发送响应并允许 php 进程继续来释放浏览器。

ignore_user_abort(true);
$response = "Processing!"; 
header("Connection: close");
header("Content-Length: " . mb_strlen($response));
echo $response;
flush();

// Insert your lengthy query here
于 2013-01-09T13:51:21.593 回答
0

来吧伙计们,这是 PHP 101。引自手册:

您可以决定是否希望客户端断开连接导致脚本中止。有时,即使没有远程浏览器接收输出,始终让脚本运行完成也很方便。但是,默认行为是在远程客户端断开连接时中止您的脚本。

连接标志设置为 ABORTED 后,执行将在下一个可滴答事件处停止 - 当 PHP 尝试将输出刷新到客户端时将检测到

当前的 MySQL 查询将完成执行(因为 PHP 控制的下一个事件直到查询完成后才会发生),但您的脚本不会超过它,除非您明确设置ignore_user_abort. 在编写代码时考虑到这一点总是很重要的。

有两种方法可以解决这个问题

  1. 设置ignore_user_aborttrue调用您的脚本
  2. 在所有处理完成之前不要将任何内容打印回客户端 - 因为在刷新输出之前不会检测到连接关闭状态
于 2013-01-09T13:54:47.943 回答
0

答案是视情况而定,正如其他人提到的,您可以使用 show processlist 检查 mysql 服务器上正在运行的内容;

如果是单个查询需要很长时间,它很可能会在浏览器关闭后继续运行。PHP 将已将请求发送到数据库,实际上将等待它完成,而浏览器将等待网络服务器完成构建该 url 上的页面/资源

所以请求是:浏览器 <-> web 服务器 (<-> php ) <-> mysql 在理想世界中,如果用户取消请求,一切都会很好地自行整理,但根据我的经验,遗憾的是,如果链中的一个决定不等待,它正在等待的进程不一定知道,直到它尝试发回响应并失败

于 2013-01-09T13:55:27.860 回答