Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如果MySql查询花费的时间超过一秒钟,则跳过它_Php_Mysql - Fatal编程技术网

PHP:如果MySql查询花费的时间超过一秒钟,则跳过它

PHP:如果MySql查询花费的时间超过一秒钟,则跳过它,php,mysql,Php,Mysql,我有一个php页面,有时在脚本开始时需要写入数据库 在mysqldump定时备份期间,该页无法访问,因为它正试图写入已锁定的表 在锁定期间,MySql对这些sql更新进行排队,备份完成后,它们会按需要执行。然而,在备份完成之前,我的php页面不会显示 但是,由于更新不会向脚本返回任何内容,我希望他们不会在锁定期间挂断我的脚本;我希望有一种方法可以告诉php将sql更新发送到mysql,而不用担心更新是否完成 我希望php将查询发送到mysql,如果更新没有在一秒钟内完成,则继续执行php的下一行

我有一个php页面,有时在脚本开始时需要写入数据库

在mysqldump定时备份期间,该页无法访问,因为它正试图写入已锁定的表

在锁定期间,MySql对这些sql更新进行排队,备份完成后,它们会按需要执行。然而,在备份完成之前,我的php页面不会显示

但是,由于更新不会向脚本返回任何内容,我希望他们不会在锁定期间挂断我的脚本;我希望有一种方法可以告诉php将sql更新发送到mysql,而不用担心更新是否完成

我希望php将查询发送到mysql,如果更新没有在一秒钟内完成,则继续执行php的下一行

我在windows服务器上运行php,所以我知道某种类型的线程是不可取的

如果有办法在该查询上设置一个超时(特别是),这可能是理想的,但如果sql更新超时,我不想完全放弃它。我仍然希望MySQL在锁消失后处理它


您有什么建议(考虑到不能完全删除sql更新)?

一种解决方案,使用PDO,启动连接并超时,开始事务,如果您有锁,超时将关闭连接并回滚


对于PDO中的超时,要使用PDO::ATTR_timeout。

我认为唯一的方法是将脚本分成几部分并使用ajax调用,
您可以发送大更新并继续执行与该过程无关的脚本的其余部分,如果所有脚本都依赖于更新的结果,唯一的方法就是进行良好的加载…

对于可能遇到此线程的其他人,我最终编写了此函数来检测表是否被锁定,并且仅当SQL未锁定时才进行SQL更新:

function isLocked($databaseName,$tableName)
    {
        $sql = "show open tables from `".$databaseName."` where `table`=`".tableName."` and In_use > 0;";
        $result = @mysql_query($sql);
        if (mysql_num_rows($result) != 0 )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
(注意:此函数假定数据库连接已建立)


这是可行的,因为我修改了代码,以便在下次加载页面时,sql更新最终能够在没有锁定的情况下完成。

不可能。PHP无法控制实际的查询调用机制。PHP不是线程化的,不管它在哪个操作系统上运行。如果PHP有某种类型的超时函数,可以在对封装的函数设置超时的同时封装任何其他函数调用,从技术上讲,这是多线程的吗?不。PHP不支持任何线程化,如果不对整个语言进行基本的重写(例如PHPV6),很可能永远不会变成多线程。大多数PHP核心库都不是线程安全的。您知道我可以在sql语句中指定哪些解决方案,以便在更新未完成的情况下在一秒钟后返回true吗?不知道。PHP中没有任何内容。你最好的选择可能是加入一个排队系统——在转储开始时设置一个标志,当标志处于热状态时出现的任何更新都会卡在队列中,然后在标志被禁用后处理。这是一个好主意,但我需要这些sql更新,即使用户没有启用javascript。