За последние 24 часа нас посетили 22834 программиста и 1263 робота. Сейчас ищут 747 программистов ...

cURL повторная отправка при ошибке

Тема в разделе "PHP для новичков", создана пользователем joylord, 25 авг 2020.

  1. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    Привествую!
    использую сервис leeloo для отправки уведомлений и сообщений пользователям сайта, которые подписались на воронку.
    Использую cURL для отправки через API
    Стоит ограничение - 50 запросов в минуту, и если запросов больше, выдает ошибку.
    Too many requests, please try again later.


    Есть несколько функций по отправке

    PHP:
    1. function send_message() { //send message to leeloo API
    2.      
    3.         $text = 'text';
    4.         $user_data = get_userdata($user_id);  
    5.         $accountId = $user_data->user_login;
    6.      
    7.         $token = 'TOKEN';
    8.         $link = 'https://api.leeloo.ai/api/v1/messages/send-message';
    9.         $Data['text'] = $text;
    10.         $Data['account_id'] = $accountId;
    11.         $DataOK = json_encode($Data);
    12.         $descriptor = curl_init($link);
    13.         curl_setopt($descriptor, CURLOPT_POSTFIELDS, $DataOK);
    14.         curl_setopt($descriptor, CURLOPT_RETURNTRANSFER, 1);
    15.         curl_setopt($descriptor, CURLOPT_HTTPHEADER, array('Content-Type: application/json','X-Leeloo-AuthToken: '.$token));
    16.         curl_setopt($descriptor, CURLOPT_CUSTOMREQUEST, 'POST');
    17.         $itog = curl_exec($descriptor);
    18.      
    19.         $err = curl_error($descriptor);
    20.      
    21.         if ($err) {
    22.           echo "cURL Error #:" . $err;
    23.         } else {
    24.           echo $itog;
    25.         }
    26.      
    27.         curl_close($descriptor);
    28.         return $itog;
    29.     }
    30. send_message();

    PHP:
    1.     function create_order() { //create order
    2.        
    3.         //$date = gmdate("Y-m-d H:i:s");
    4.         $token = 'TOKEN';
    5.         $link = 'https://api.leeloo.ai/api/v1/orders';
    6.        
    7.        
    8.         //$Data['text'] = $text;
    9.         $Data['paymentCreditsId'] = 'ORDER ID';
    10.         $Data['email'] = 'test@i.ua';
    11.         $Data['phone'] = '+380671111111';
    12.         $Data['transactionDate'] = gmdate("Y-m-d H:i:s");
    13.         $Data['offerId'] = 'OFFER ID';
    14.         $Data['accountId'] = 'USER ID';
    15.         $Data['isNotifyAccount'] = 'true';
    16.        
    17.         $DataOK = json_encode($Data);
    18.         $descriptor = curl_init($link);
    19.         curl_setopt($descriptor, CURLOPT_POSTFIELDS, $DataOK);
    20.         curl_setopt($descriptor, CURLOPT_RETURNTRANSFER, 1);
    21.         curl_setopt($descriptor, CURLOPT_HTTPHEADER, array('Content-Type: application/json','X-Leeloo-AuthToken: '. $token));
    22.         curl_setopt($descriptor, CURLOPT_CUSTOMREQUEST, 'POST');
    23.         $itog = curl_exec($descriptor);
    24.         $err = curl_error($descriptor);
    25.         if ($err) {
    26.           echo "cURL Error #:" . $err;
    27.         } else {
    28.           echo $itog;
    29.         }
    30.  
    31.         curl_close($descriptor);
    32.         return $itog;
    33.  
    34.     }
    35.    
    36.     create_order();
    Ответ, при успешной отправке
    Код (Javascript):
    1. {"data":{},"status":1}
    Подскажите, как отправить еще раз запрос, если он не был успешно отправлен?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    При создании заказа - не пытаться сразу отправлять, а помещать задание в очередь
    из очереди - по расписанию отправлять определенное кол-во раз
    при успешной отправке - удалять из очереди, иначе - задача остается в очереди - и будет выполнена в следующий раз
    + можно счетчик неуспешных попыток (или дату смотреть - не более чес 24 часа) им присобачить и при отказе например 10 раз - оповещать об этом в лог выполнения, а саму задачу удалять из очереди

    Ну или если совсем по простому
    PHP:
    1. if (send_message() == тут сравнение с неуспешностью отправки) send_message();
    или

    PHP:
    1. $res = send_message();
    2. while ( $res == тут сравнение с неуспешностью отправки) {
    3. $res = send_message();
    4. }
    будет отправлять - пока не отправит
     
    #2 ADSoft, 25 авг 2020
    Последнее редактирование: 25 авг 2020
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    тут как раз конструкция do {...} while (); :)
    --- Добавлено ---
    PHP:
    1. do
    2. {
    3.    $res = send_message();
    4. }
    5. while ( $res === false );
    PHP:
    1. $itog = curl_exec ( $descriptor );
    2.  
    3. $err = curl_error ( $descriptor );
    4.  
    5. if ( $err )
    6. {
    7.     return false;
    8. }
    9.  
    10. curl_close ( $descriptor );
    11.  
    12. return $itog;
     
    #3 MouseZver, 25 авг 2020
    Последнее редактирование: 25 авг 2020
  4. Brick

    Brick Гость

    С нами с:
    25 авг 2020
    Сообщения:
    1
    Симпатии:
    0
    Помогите пожалуйста, мне нужно сделать выборку из двух таблиц и вывести один первый результат
    <?
    $iq= mysql_query('SELECT * FROM `inv_mod`,`mod` WHERE
    `inv_mod.mod_id` = `mod.mod_id` AND
    `inv_mod.user_id` = "'.$user['id'].'" AND `inv_mod.item_q` = "0" AND
    `mod.lvl` = "3" AND
    `mod.tip` = "5" ');

    $iq = mysql_fetch_array($iq);
    ?>
    Мод 3: <?=$id['inv_mod.id']?>
    Что тут не так?