file_get_contents重试机制的实现

时间:2023-01-03 12:06:58

最近出现Warning告警 file_get_contents(http://a.b.com/xxx/yyy/zzz/?token=da606c144dd9e62e4c3cd701d444638515441538801672658102): failed to open stream: Connection timed out

file_get_contents可以获取远程资源,但是跨网络访问时可能会出现异常,于是对file_get_contents进行外层封装增加重试机制解决问题。

/**
 * file_get_contents 获取远程资源重试(file_get_contents重试机制2023-01-03)
 * @param string $remoteFileName 远程文件地址
 * @param int $maxRetryTimes 最大重试次数
 */
function retry_remote_file_get_contents(string $remoteFileName,int $maxRetryTimes = 10)
{
    $result = file_get_contents($remoteFileName);

    $retryTimes=0;
    if($result === false)
    {
        for($retryTimes=0;$retryTimes<$maxRetryTimes;$retryTimes++)
        {
            $retryTimes++;
            $result = file_get_contents($remoteFileName);

            if($result !== false)
            {
                error_log("FILE_GET_CONTENTS重试{$retryTimes}次后成功,请求远程文件地址:{$remoteFileName}");
                break;
            }
            sleep(1);
        }
    }

    if($result === false)
    {
        //通知告警
        qywx_robot_error_notice("FILE_GET_CONTENTS重试{$retryTimes}次后失败,请求远程文件地址:{$remoteFileName}");
    }
    return $result;
}