2015-12-06 3 views
0

У меня есть сайт, который тянет цены от 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) 
    . 
} 
+0

sleep() должен работать. Если вам нужно что-то повторить, оно будет сохранено в буфере и напечатано в конце скрипта. Выполнение запросов к базе данных не должно быть проблемой. Вы на самом деле пробовали? – Andy

ответ

0

сна() не должен влиять/буфер запросов к базе данных. Вы можете использовать ob_flush(), если вам нужно немедленно распечатать. Также убедитесь, что максимальное время выполнения установлено с set_time_limit(), поэтому ваш скрипт не отключается.

set_time_limit(600); 

while ($row = mysql_fetch_array($result)) { 
    $id = $row['id']; 
    $updatedPrice = getItemPrices($id); 
    . 
    . 

    echo $updatedPrice; 

    //Sleep 1 seconds, use ob_flush if necessary 
    sleep(1); 

    //You can also use usleep(..) to delay the script in milliseconds 
} 
+0

Я пробовал это раньше с задержками 1, 2 и 5 с, и до сих пор получил таймаут. Это было с печатью. Затем я попытался удалить утверждения печати и получил ту же проблему. Примерно на полпути через (иногда больше, иногда меньше) я буду получать предупреждения PHP: 'Примечание: Попытка получить имущество не-объект в updatePrices.php на линии 38' Я полагаю, сейчас я буду стараться и внести некоторые изменения, чтобы он проверял только подмножество данных, пока не найду что-то, что работает со всем этим, но спасибо за помощь! – Sej

+0

Может случиться так, что ваше соединение с базой данных истекает? – Andy