【问题标题】:PHP set_time_limit and then reset database changesPHP set_time_limit 然后重置数据库更改
【发布时间】:2013-01-09 07:22:07
【问题描述】:

我有一个 API,移动应用程序使用它来创建用户配置文件。似乎有时应用程序会超时并显示错误消息,但服务器会继续创建配置文件。结果是我们有一些重复的配置文件。

我认为,作为不需要完全重新架构的“快速修复”,我可以尝试设置 PHP 脚本的执行时间以匹配应用程序中的超时限制。我的问题是,如果达到这个时间限制,我能否以某种方式执行“撤消对数据库的更改”脚本,无论是自动的还是我指定的脚本?

我知道我真的应该更多地研究为什么 PHP 会达到超时限制(它是几分钟!),但我已经在服务器上调整了一些位,并且大多数执行时间只有几毫秒.只有少数情况会发生超时。对于一个示例,我正在查看用户位于以色列的那一刻。以色列的网络连接不好吗?谁能想到任何可能导致我正在经历的行为的事情?

【问题讨论】:

    标签: php api timeout


    【解决方案1】:

    假设:您使用的是带有 INNODB 的 MySQL。

    您应该考虑使用transactions。使用 INNODB,事务将 rollback if the session times out IF 您将 autocommit 设置为 0,如下所示:

    SET GLOBAL init_connect='SET autocommit=0';
    

    PDO 的交易示例:

    try {
        // First of all, let's begin a transaction
        $db->beginTransaction();
    
        // A set of queries ; of one fails, an exception should be thrown
        $db->query('first query');
        $db->query('second query');
        $db->query('third query');
    
        // If we arrive here, it means that no exception was thrown
        // i.e. no query has failed ; and we can commit the transaction
        $db->commit();
    
    } catch (Exception $e) {
        // An exception has been thrown
        // We must rollback the transaction
        $db->rollback();
    }
    

    【讨论】:

      【解决方案2】:

      一种方法是使用数据库事务。我在 PostgreSQL 方面有这方面的经验,但我相信 MySql 也会这样做。您会将所有内容包装在事务中。然后你可以在检测到失败时取消事务,回滚属于该事务的所有内容。

      然后,您无法捕获脚本超时,因为它是一个致命错误,但是如果事务未提交,则应自动回滚(取消),因此您应该设置...

      也许它对你有用?

      参考资料:

      【讨论】:

        猜你喜欢
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        • 2012-09-20
        相关资源
        最近更新 更多