У меня есть сайт, который тянет цены от API. Проблема заключается в том, что если вы отправляете более ~ 10 запросов к этому API за короткий промежуток времени, ваш ip временно блокируется (я не уверен, что это просто проблема на локальном хосте или если это также будет проблемой из веб-сервер, я предполагаю, что последний).PHP Подождите, прежде чем отправлять следующий запрос api
Запрос API возвращает объект JSON, который затем обрабатывает и хранит некоторые его части в моей базе данных. В базе данных около 300 записей, поэтому для этого API требуется около 300 запросов.
В результате я получаю задание cron, которое каждые х часов, все цены обновляются из API. Задание вызывает скрипт php, который выполняет всю обработку запроса и db.
Есть ли способ, чтобы сценарий отправлял запросы в течение более длительного периода времени, а не сразу? Проблема, с которой я сталкиваюсь, заключается в том, что после ~ 20 или около того запросов ip блокируется, а следующие 50 или около того запросов после этого не возвращают данные.
Я заглянул в сон(), но прочитал, что он просто сохранит результаты в буфере и ждет, а не ждет после каждого запроса.
Вот сценарий, что хроны будут вызывать:
define('HTTP_NOT_FOUND', false);
define('HTTP_TIMEOUT', null);
function http_query($url, $timeout=5000) {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT_MS, $timeout);
$text = curl_exec($curl);
if($text) {
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
switch($code){
case 200:
return $text;
case 404:
return -1;
default:
return -1;
}
}
return HTTP_TIMEOUT;
}
function getPrices($ID) {
$t = time();
$url = url_to_API;
$result = http_query($url, 5000);
if ($result == -1) { return -1; }
else {
return json_decode($result)->price;
}
}
connectToDB();
$result = mysql_query("SELECT * FROM prices") or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
$id = $row['id'];
$updatedPrice = getItemPrices($id);
.
.
echo $updatedPrice;
. // here I am just trying to make sure I can get all ~300 prices without getting any php errors or the request failing (since the ip might be blocked)
.
}
sleep() должен работать. Если вам нужно что-то повторить, оно будет сохранено в буфере и напечатано в конце скрипта. Выполнение запросов к базе данных не должно быть проблемой. Вы на самом деле пробовали? – Andy