Php 如何使脚本调用自身
我有一个PHP脚本,它通过API接收和发送大量数据。它工作正常,但脚本调用的API有时会中断并返回500服务器错误。在这种情况下,我希望使脚本重新启动 我该怎么做? 我尝试了Php 如何使脚本调用自身,php,api,restart,Php,Api,Restart,我有一个PHP脚本,它通过API接收和发送大量数据。它工作正常,但脚本调用的API有时会中断并返回500服务器错误。在这种情况下,我希望使脚本重新启动 我该怎么做? 我尝试了标题(“位置:http://example.com/myscript.php");但没有成功 编辑(因为有6个人点击了将此问题搁置): 好的,我的myscript.php应该作为crontab运行 这个myscript.php将大量数据发送到一个外部/远程API(它不是我的API,所以我无法在这里解决问题)。。但API有时
标题(“位置:http://example.com/myscript.php");代码>但没有成功
编辑(因为有6个人点击了将此问题搁置):
- 好的,我的myscript.php应该作为crontab运行
- 这个myscript.php将大量数据发送到一个外部/远程API(它不是我的API,所以我无法在这里解决问题)。。但API有时会在数据量变化后崩溃。。(我发送的tha数据经过检查和验证)
myscript.php首先询问API哪些数据已经发送到它,然后跳过,因此当myscript.php可以重新启动时,它会在某个时候完成:)听起来你并不是说你的脚本失败了,而是说你的脚本使用了一个偶尔会失败的web 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停止工作,那么脚本就会在无限循环中重新启动。对自己执行curl
调用,然后exit()代码>
这将导致脚本的另一个实例启动(使用GET调用url),强制此调用在5秒后停止,而不是等待另一个实例完成执行,然后退出();无论你想要什么文本
编辑:您可能还需要设置ignore\u user\u abort(true)
,以便在停止curl调用以执行exit时防止新脚本死亡如果脚本中断,那么它将不会执行任何其他操作。我会首先尝试找出脚本崩溃的原因,然后集中精力解决这个问题。通常当脚本崩溃时,它会停止运行,您无法运行更多的代码。您必须使用类似javascript的东西来执行ajax调用,如果ajax调用返回500个错误,javascript可以重新请求页面。正如Frankerz所说,找出导致错误的原因并解决它。您可能会在错误日志中看到该问题(在我的头顶上,我会说是最大执行时间)。Location
重定向会导致浏览器在指定的url上发出get
。如果脚本最初是通过POST调用的,那么您不是以相同的方式调用它,也不是传递发布的任何数据,等等。。。e、 g.以这种方式重新启动基本上是毫无意义的。尽管如此,对标题的调用是毫无意义的,无论get/post如何。如果服务器抛出500错误,对header的调用将永远不会运行,因为php将停止处理。我可以知道下一票是为了什么吗?它准确地回答了问题的答案。最好避免这种模式。默认情况下,如果未设置ignore\u user\u abort()
,则PHP脚本不会继续执行,因此子脚本将在5秒后停止运行。更糟糕的是,如果您对如何使用它不十分小心,可能会导致大量请求同时运行,可能会导致服务器崩溃……此外,某些托管环境可能不允许网站对自身进行递归调用,或者可能会限制同时运行的PHP请求的数量。在这样的环境下使用此代码将失败。我并不是说这是正确的方法,但它仍然是问题的正确答案。至于第一部分,它可能在用户中止上工作,也可能不工作,在很多情况下我发现它工作。他总是可以只在这个脚本中包含它,这确实是我的缺点,因为我没有在我的答案中包含一个可能不正确的问题的正确答案仍然是一个正确的答案这是我在类似情况下使用第三方http请求所做的。我通常在两次尝试之间睡一两秒钟,尝试5次。它必须是一个非常糟糕的API才能失败。你也可以做一些更有创意的事情,比如睡眠2*i秒,这样每个循环等待的时间就越来越长。
$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();