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