失败时重试尝试/捕获


Retry a try/catch when it fails

我已经尝试了几种不同的尝试/捕获循环来尝试自动解决问题,但它们似乎总是导致软件死亡。

$doLoop = true;
while ($doLoop) {
    try {
        //do a thing
        insertIntoDb($data);
    } catch (Exception $e) {
        //try again
        insertIntoDb($data);
        //write error to file
        writeError($e);
    }
}

这是我最初的尝试/捕获。

问题是有时MySQL服务器"消失",我需要捕获该异常并不断重试,直到它回来。

我可以在这里更改什么以使它继续重试直到成功?

使用中断作为try块中的最后一个语句,仅在成功时离开循环。

但是,您还应该改用for循环来限制重试次数。
否则,您的代码可能会在无限循环中运行:

// limit the number of retries to 3 retries to avoid endless looping
for ($i=1; $i <= 3; $i++) {
    try {
        // do something
        insertIntoDb($data);
        // leave loop only if above statement succeeds
        break;
    } 
    catch (Exception $e) {
        writeError($e);
    }
    // sleep 200ms to give the MySQL server time to come back up
    usleep(200000);
}

另请注意usleep()调用:

这很重要,因为否则 PHP 进程将占用所有资源(100% CPU),同时尽可能快地重试。您可以根据需要调整该值。(在您的情况下,200ms可能太长或太短)

另请注意,失败时可能需要重新连接到 MySQL 数据库!我在我的示例中没有包含该案例的代码。

这只有在函数insertIntoDb抛出异常时才有效。如果您使用 mysql* 函数,那么它将不起作用。

insertIntoDb($data);后,您应该设置$doLoop = false