我最近通过 chrome 执行了一个 mysql 查询并将其关闭。浏览器究竟是如何使用停止按钮停止 PHP 脚本的?我认为 PHP 是一种服务器端语言,无法通过客户端进行控制。
*更新*我现在知道了SHOW PROCESSLIST
,但这只会显示哪些线程正在运行。是否有一个 SQL 命令可以用来查看执行的查询的详细信息?
客户端 (Chrome) 与在服务器上执行脚本 (PHP) 无关,而服务器又无法控制数据库进程(MySQL 查询)。
查看您的服务器进程列表以了解一般情况(Apache 进程)。
甚至更好:SHOW PROCESSLIST;
在 MySQL 控制台上使用来查找长时间运行的查询。您可以使用 退出它KILL ###ID_OF_QUERY###;
。
不,您不需要保持打开状态。如果您退出正在行驶的汽车,汽车会熄火吗?不。
对不起,这有点流鼻涕,但也不是故意的。
浏览器(在您的情况下为 Chrome)实际上并未运行实际代码。服务器是。因此,一旦执行了指令,关闭浏览器就不再重要了,因为请求已经发送给了服务器。
两个函数对于执行耗时的 php 脚本是必不可少的。它与浏览器无关(正如其他用户已经指出的那样)
无论浏览器关闭,脚本都会继续执行。您可以通过发送响应并允许 php 进程继续来释放浏览器。
ignore_user_abort(true);
$response = "Processing!";
header("Connection: close");
header("Content-Length: " . mb_strlen($response));
echo $response;
flush();
// Insert your lengthy query here
来吧伙计们,这是 PHP 101。引自手册:
您可以决定是否希望客户端断开连接导致脚本中止。有时,即使没有远程浏览器接收输出,始终让脚本运行完成也很方便。但是,默认行为是在远程客户端断开连接时中止您的脚本。
连接标志设置为 ABORTED 后,执行将在下一个可滴答事件处停止 - 当 PHP 尝试将输出刷新到客户端时将检测到
当前的 MySQL 查询将完成执行(因为 PHP 控制的下一个事件直到查询完成后才会发生),但您的脚本不会超过它,除非您明确设置ignore_user_abort
. 在编写代码时考虑到这一点总是很重要的。
有两种方法可以解决这个问题
ignore_user_abort
为true
调用您的脚本答案是视情况而定,正如其他人提到的,您可以使用 show processlist 检查 mysql 服务器上正在运行的内容;
如果是单个查询需要很长时间,它很可能会在浏览器关闭后继续运行。PHP 将已将请求发送到数据库,实际上将等待它完成,而浏览器将等待网络服务器完成构建该 url 上的页面/资源
所以请求是:浏览器 <-> web 服务器 (<-> php ) <-> mysql 在理想世界中,如果用户取消请求,一切都会很好地自行整理,但根据我的经验,遗憾的是,如果链中的一个决定不等待,它正在等待的进程不一定知道,直到它尝试发回响应并失败