php 当try/catch失败时重试

o7jaxewo  于 2023-04-19  发布在  PHP
关注(0)|答案(2)|浏览(290)

我尝试了几种不同的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);
    }
}

这是我最初的try/catch。
问题是有时MySQL服务器“消失”,我需要捕获该异常并不断重试,直到它回来。
我可以在这里更改什么,以使此不断重试,直到成功?

kr98yfug

kr98yfug1#

try块中使用break作为最后一条语句,使循环只在成功时进行。
但是你也应该使用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),同时尽可能快地重试。您可以调整该值以满足您的需要。(在您的情况下,200 ms可能太长或太短)
另外请注意,在失败时,您可能需要重新连接到MySQL DB!在我的示例中,我没有包含这种情况的代码。

pdkcd3nj

pdkcd3nj2#

只有当你的函数insertIntoDb抛出一个Exception的时候,这个方法才能起作用。如果你使用mysql* 函数,那么它就不能起作用。
insertIntoDb($data);之后,您应该设置$doLoop = false

相关问题