ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

php退出后,mysql_query()继续运行

2019-11-21 13:15:52  阅读:248  来源: 互联网

标签:tokudb mysql php


我注意到,如果我使用mysql_query()用php执行长时间运行的mysql查询(我知道我不应该使用它),然后php进程被杀死,那么查询将继续在mysql服务器上运行.这不是持久连接.通过以下方式建立连接:

$db = mysql_connect($host, $login, $pass, false);
$sql = 'SELECT COUNT(*) FROM `huge_table`';
$result = mysql_query($sql, $db);

例如,假设我有一个10亿的行表,并且php进程出于某种原因这样做:

SELECT COUNT(*) FROM `huge_table`

然后它超时(例如,因为我运行的是带有request_terminate_timeout = 5的php-fpm),所以它在5秒钟后杀死了该进程,以确保它不会占用大量资源.

尽管该进程被终止,但即使在wait_timeout之后,查询仍然在mysql上运行.

无论如何,要确保如果php进程由于某种原因退出,它也会杀死它发出的任何正在运行的查询?

我正在使用tokudb 5.5.38-tokudb-7.1.7-e这是mysql 5.5.38

解决方法:

crickeys,当PHP脚本开始执行并到达执行MySQL查询的部分时,该查询将移交给MySQL.查询的控制不再在PHP的手中….此时,PHP仅在等待来自MySQL的响应,然后它才能继续进行.终止PHP脚本不会影响MySQL查询,因为好吧,查询是MySQL的事.

换句话说,PHP到了门,敲门,交出了货物,等着您带回响应,以便他继续前进.射击他不会影响门后发生的事情.

您可以运行以下操作来检索运行时间最长的进程并杀死它们:

<?php
    $con=mysqli_connect("example.com","peter","pass","my_db");
// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SHOW FULL PROCESSLIST");

while($row = mysqli_fetch_array($result)) {
if ($row["Time"] > $max_excution_time ) {
    $sql="KILL ".$row["Id"];
    mysql_query($sql);
    }   

}

mysqli_close($con); ?>

标签:tokudb,mysql,php
来源: https://codeday.me/bug/20191121/2051993.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有