时间:2021-04-19 16:03:48
/**
* @param $url
* @param $post_data
* @param int $retry 重试次数, 默认3次
* @param int $sleep 重试间隔时间, 默认1s
* @return bool|string
*/
public function get_http_array($url, $post_data, $retry = 3, $sleep = 1)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //没有这个会自动输出,不用print_r();也会在后面多个1
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
// 如果调用成功,会直接返回图片二进制内容,如果请求失败,会返回 JSON 格式的数据
$out = json_decode($output);
// 重试
while (!is_null($out) && $retry--) {
Log::write("进入重试:{$retry}---");
if ($out->errcode == 40014 || $out->errcode == 40001 || $out->errcode == 41001 || $out->errcode == 41021 || $out->errcode == 42001) {
$tmp = [];
parse_str(parse_url($url)['query'], $tmp);
$access_token = $this->get_access_token(true);
$url = str_replace($tmp['access_token'], $access_token, $url);
curl_setopt($ch, CURLOPT_URL, $url);
Log::write("重试:{$retry}---" . $tmp['access_token'] . '---' . $access_token . '---' . $url);
sleep($sleep); //阻塞1s
$output = curl_exec($ch);
$out = json_decode($output);
} else {
// 应该需要抛出去
throw new \Think\Exception($out->errmsg);
}
}
curl_close($ch);
return $output;
}