繁体   English   中英

PHP:如果需要的时间超过一秒,请跳过MySql查询

[英]PHP: Skip MySql Query if it takes longer than a second

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

在计划的mysqldump备份期间,页面无法访问,因为它正在尝试写入已锁定的表。

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

但是,由于更新不会向脚本返回任何内容,我希望它们在锁定期间不会挂起我的脚本; 我希望有一种方法可以告诉php只是将sql更新发送到mysql并且不担心更新完成的确认。

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

我在Windows服务器上运行php,所以我知道某种类型的线程不是一种选择。

如果有办法在该查询上设置超时(具体而言),那可能是理想的,但如果超时,我不想完全违背sql更新。 在锁定消失后,我仍然希望MySQL处理它。

你会推荐什么(考虑到完全删除sql更新不是一个选项)?

一个解决方案,使用PDO,启动连接超时,开始事务和你已经锁定的情况,超时将关闭连接并将回滚。

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

对于其他人可能遇到此线程,我最终写了这个功能来检测,如果表被锁定,并且只能做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更新。

我认为唯一的方法是将脚本拆分并使用ajax调用,如果所有脚本都依赖于结果,您可以发送大更新并继续使用不依赖于该进程的其余脚本更新,唯一的方法是做一个很好的加载......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM