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

时间:2012-06-09 04:57:01

标签: php mysql

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

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

对于可能遇到此线程的其他人,我最终写了这个函数来检测表是否被锁定,并且只有在 NOT 锁定时才进行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更新。

答案 2 :(得分:1)

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