发布网友 发布时间:2022-04-29 00:14
共2个回答
懂视网 时间:2022-05-12 13:01
一般我们访问HTTP方式很多,主要是:curl, socket, file_get_contents() 等方法。如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。
[ CURL 访问HTTP]
CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。(推荐学习:PHP编程从入门到精通)
还是让我们使用 cURL 扩展来处理超时控制吧
假如你想更精确的处理超时,就使用 cURL 扩展,它可以设置连接超时和读取超时(CURLOPT_TIMEOUTCURLOPT_CONNECTTIMEOUT)。
假如希望控制 HTTP 接口必须在毫秒级别返回,还可以使用 CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_M 常量。
注意假如使用这两个常量,必须设置 curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
神奇的来了,cURL 扩展机制很特别,在指定的读取时间获取到多少数据就返回多少,然后调用也终止,程序并不报错
通过代码看一下:
function e_curl() { global $url; $ch = curl_init($url); curl_setopt($ch, CURLOPT_NOSIGNAL, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 3); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); $response = curl_exec($ch); if ($response === false) { $info = curl_getinfo($ch); if ($info['http_code'] === 0) { return false; } } return true;}e_curl();
热心网友 时间:2022-05-12 10:09
摘要间 假设A系统有个方法methodA,会调用B系统的methodB这个http接口,如果mehodA不追求超快的响应速度,那么你在调用methodB这个http接口时,可以增长超时时间,例如10秒超时。因为经常在某些时刻,由于网络原因或者系统原因,调用method会超时的。2.尝试多调用一次 如果第一次调用methodB超时了,那么你可以尝试多调用一次。当然前提是,methodA不追求超快的响应时间。注意:调用多次不代表重复调用 制造脏数据3.使用待处理队列 如果methodA需要很快的响应速度,那么当调用methodB接口超时时,可以使用一个队列存储本次失败的记录,然后使用一个job每隔一段时间去扫这个队列,看看是否有待处理的数据。 备注:如果对方系统挂掉了,使用待处理队列的方式,比较合适。4.回滚数据 catch这个超时异常,然后记录日志后,抛出这个异常,并把之前的数据回滚咨询记录 · 回答于2021-12-15接口超时需要怎么处理间 假设A系统有个方法methodA,会调用B系统的methodB这个http接口,如果mehodA不追求超快的响应速度,那么你在调用methodB这个http接口时,可以增长超时时间,例如10秒超时。因为经常在某些时刻,由于网络原因或者系统原因,调用method会超时的。2.尝试多调用一次 如果第一次调用methodB超时了,那么你可以尝试多调用一次。当然前提是,methodA不追求超快的响应时间。注意:调用多次不代表重复调用 制造脏数据3.使用待处理队列 如果methodA需要很快的响应速度,那么当调用methodB接口超时时,可以使用一个队列存储本次失败的记录,然后使用一个job每隔一段时间去扫这个队列,看看是否有待处理的数据。 备注:如果对方系统挂掉了,使用待处理队列的方式,比较合适。4.回滚数据 catch这个超时异常,然后记录日志后,抛出这个异常,并把之前的数据回滚脚本中断后系统会报错,所以,这边还有个处理技巧,先记下当前的报错级别,然后重置为0,即不报任何错误,不自动抛出异常,然后脚本超时后,调用register_shutdown_function注册一个自定义函数,超时后会自动调用这个函数,显示自定义的信息。当然,如果webservice连接成功的话,还是需要回复先前的错误级别,不然,webservice连接超时后的异常将无法捕获。