如何让脚本调用自己

时间:2015-11-13 21:34:30

标签: php api restart

我有一个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 可以重新启动时,它将会完成: )

2 个答案:

答案 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调用以执行退出时死亡