失败时重试try / catch

时间:2015-01-30 15:26:03

标签: php

我尝试了一些不同的try / catch循环来尝试自动解决问题,但它们似乎总是导致软件死亡。

$doLoop = true;

while ($doLoop) {

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

这是我原来的尝试/捕获。

问题有时候MySQL服务器消失了#39;我需要捕获该异常并继续重试,直到它恢复。

我可以在此更改以便在成功之前继续重试?

2 个答案:

答案 0 :(得分:12)

try块中使用break作为最后一个语句,仅在成功时保留无限循环:

while (true) {
    try {
        //do a thing
        insertIntoDb($data);
        break;
    } 
    catch (Exception $e) {
        writeError($e);
    }
    // sleep 200ms to give the MySQL server time to come back up
    usleep(200000);
}

您也可以使用for循环来限制重试次数:

// do 3 retries before aborting finally
for ($i=1; $i <= 3; $i++) {
    try {
        //do a thing
        insertIntoDb($data);
        break;
    } 
    catch (Exception $e) {
        writeError($e);
    }
    // sleep 200ms to give the MySQL server time to come back up
    usleep(200000);
}

请注意usleep()来电:

这很重要,否则PHP进程会尽可能快地重试所有资源(100%CPU)。您可以调整值以满足您的需求。 (在你的情况下,可能200毫秒太长或太短)

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

答案 1 :(得分:2)

只有当函数insertIntoDb抛出异常时,这才有效。如果你使用mysql *函数,那么它就不会工作。

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