我有一个PHP脚本,它通过/接收和发送大量数据到API。它工作正常,但我的脚本调用的API有时会中断并返回 500 Server Error 。在这种情况下,我想让我的脚本重新启动
我该怎么做?
我试过header("Location: http://example.com/myscript.php");
但没有成功。
编辑(由于点击了6个人暂停了此问题):
好的,所以我的 myscript.php 应该作为crontab运行..
这个 myscript.php 将大量数据发送到外部/远程API(它不是我的API,因此我无法解决这里的问题)..但是在变化的数据之后,API有时会崩溃。(我发送的数据经过检查和验证)
myscript.php 首先询问API哪些数据已经发送到它并跳过它,所以当 myscript.php 可以重新启动时,它将会完成: )
答案 0 :(得分:4)
听起来你并不是说你的脚本失败了,但是你的脚本使用偶尔会失败的网络API。
如果API因您发送给它的数据而返回错误,则应重新检查您的代码,以确定如何防止创建此类数据。
另一方面,如果API在您发送数据时随机失败,并在后续请求中成功,则最好停止使用API。
如果您因任何原因而无法使用它,并且您只想重试调用而不是中止脚本,我认为您可以在不重新启动整个脚本的情况下执行此操作。
$max_attempts = 4; // Decide on a reasonable number of times to retry the call
while ($max_attempts--) {
// Try the API call up to the specified maximum number of attempts
$returned_data = $api->call($sent_data);
// Stop trying when you get a successful response
if ($returned_data != '500 Server Error') break;
}
如果随机故障相对不频繁,则此方法应显着降低整体故障率。如果您需要在后续尝试的API调用之前重复代码的某些部分,您也可以将它们包含在重试循环中。
如果你达到最大重试次数但仍然没有好的数据,那么可能会发生异常不好的事情,所以你应该停止尝试。
if ($returned_data == '500 Server Error') die ("The API probably isn't working at all");
理论上,如果每次API调用失败时都有一种方法可以重新启动整个脚本,那么如果API确实停止工作,那么您的脚本似乎会在无限循环中重新启动。
答案 1 :(得分:2)
对你的curl
exit();
来电
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/myscript.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_exec($ch);
curl_close($ch);
exit();
这将导致你的脚本的另一个实例启动(你用GET调用你的url),强制这个调用在5秒后死掉,而不是等待另一个实例完成执行,然后退出();用你可能想要的任何文字
编辑:你可能还需要设置ignore_user_abort(true)
以防止新脚本在停止curl调用以执行退出时死亡