$preferredNextApiRequestAtSecondOfHourCached) { $sleepTime = 3600 - $secondsNow + $preferredNextApiRequestAtSecondOfHourCached; } else { $sleepTime = $preferredNextApiRequestAtSecondOfHourCached - $secondsNow; } if (!$quiet) { echo 'sleep until execution of next request in '.$sleepTime."s\n"; } // a few seconds +/- is OK if ($force) { if (!$quiet) { echo 'force detected, do not sleep'."\n"; } } else { sleep($sleepTime); } } // get api data $apiResult = []; if (is_callable('file_get_contents')) { $result = false; for ($i = 1; $i < 3; $i++) { $result = file_get_contents($url); if ($result !== false) { break; } sleep(rand(5, 15)); } } elseif (function_exists('curl_version')) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $resultinfo = null; for ($i = 1; $i < 3; $i++) { $result = curl_exec($ch); $resultinfo = curl_getinfo ($ch); if ($resultinfo['http_code'] == 200) { break; } sleep(rand(5, 15)); } } $apiResult = json_decode($result, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new \Exception(__FUNCTION__.': json is invalid'); } if (isset($apiResult['preferredNextApiRequestAt']) && isset($apiResult['preferredNextApiRequestAt']['secondOfHour'])) { $preferredNextApiRequestAtSecondOfHour = $apiResult['preferredNextApiRequestAt']['secondOfHour']; } // cache if required: at first call and if the time has changed if ($preferredNextApiRequestAtSecondOfHour != $preferredNextApiRequestAtSecondOfHourCached) { if (!is_writable($cacheFilePreferredNextApiRequestAtSecondOfHour)) { file_put_contents($cacheFilePreferredNextApiRequestAtSecondOfHour, $preferredNextApiRequestAtSecondOfHour); } else { throw new \Exception(__FUNCTION__.': Cannot write to file: '.$cacheFilePreferredNextApiRequestAtSecondOfHour); } } return $apiResult; } // function