我尝试了一些不同的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;我需要捕获该异常并继续重试,直到它恢复。
我可以在此更改以便在成功之前继续重试?
答案 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