Показывать страницу по умолчанию, когда Curl слишком долго подключается к API

0

В настоящее время у меня есть сценарий на главной странице веб-сайта, подключающегося к службе api. Бывают случаи, когда api слишком долго реагирует, я пытаюсь выяснить способ отображения результатов по умолчанию, если ответ занимает более трех секунд. Я не уверен, как это сделать. Вот мой скручивающийся скрипт:

class Ofertas{
public $Name;
public $HotelId;
public $Coordinates = array();
public $Longs;
public $Response = array();


public function __construct($var){

$ofertas = new SqlIt('SELECT destination_id, destination_name, bottom_link, link FROM **** ORDER BY slot ASC LIMIT '.$var,'select',array());

foreach($ofertas->Response as $did){
    $coor = new SqlIt("SELECT CenterLatitude, CenterLongitude, RegionName FROM ***** WHERE RegionID = ? LIMIT ".$var,"select",array($did->destination_id));
    array_push($this->Coordinates,array($coor->Response[0]->CenterLatitude,$coor->Response[0]->CenterLongitude,$coor->Response[0]->RegionName));
}
$i = 0;
$url = "http://apiurl";
$curl_arr = array();
$master = curl_multi_init();
$i = 0;
foreach($this->Coordinates as $co){
    $xml = '<xmlrequesthere>xml code goes here for request</xmlrequesthere>';

            $curl_arr[$i] = curl_init($url);
            curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl_arr[$i], CURLOPT_POSTFIELDS, $xml); 
            curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl_arr[$i], CURLOPT_HTTPHEADER, array('Accept: application/xml')); 
            curl_setopt($curl_arr[$i], CURLOPT_HEADER, 0);
            curl_setopt($curl_arr[$i], CURLOPT_CONNECTTIMEOUT ,1); // number of seconds to wait for initial connection
            curl_setopt(curl_arr[$i], CURLOPT_TIMEOUT, 2); //timeout for entire process.
            curl_multi_add_handle($master, $curl_arr[$i]);



        do {
            curl_multi_exec($master,$running);
        } while($running > 0);

        if (curl_errno($curl_arr[$i])) {
                //fetch default hotels from the database

        }else{

            $results = curl_multi_getcontent  ( $curl_arr[$i]  );
            $apit = simplexml_load_string($results);
            $j['destination'] = $ofertas->Response[$i]->destination_name;
            $j['button'] = $ofertas->Response[$i]->bottom_link;
            $j['link'] = $ofertas->Response[$i]->link;
            $j['hotels'] = array();
            foreach($apit->HotelList->HotelSummary as $res){
                $hh['name'] = $res->name.'';
                $hh['hid'] = $res->hotelId.'';
                $hh['city'] = $res->city.'';
                $hh['rate'] = $res->lowRate.'';
                $hh['thumb'] = $res->thumbNailUrl.'';

                array_push($j['hotels'],$hh);
            }
        }

    array_push($this->Response, $j); 
$i++; }

    }
}//end of class

Должен ли я когда-нибудь закрывать соединение? Или я просто хочу добавить тайм-аут, как я сказал. ЛЮБАЯ ПОМОЩЬ будет очень благодарна! Благодарю!

Теги:
curl
timeout

1 ответ

2
Лучший ответ

Ниже приведен пример двух флагов таймаута, которые вы могли бы использовать, чтобы вызвать завихрение, если процесс длится долго.

curl_setopt($curl_arr[$i], CURLOPT_CONNECTTIMEOUT ,1); // number of seconds to wait for initial connection
curl_setopt(curl_arr[$i], CURLOPT_TIMEOUT, 2); //timeout for entire process.

Вам не нужно закрывать соединение нигде, потому что libcurl просто будет вызывать процесс "curl" через exec() или аналогичную функцию для вас, и это будет обрабатывать все сокеты ввода-вывода.

После того, как тайм-аут произошел, вы можете проверить, произошла ли ошибка:

if (curl_errno($curl_arr[$i])) {
    // Error Handling code here.
}
  • 0
    Спасибо, Дамиан, быстрый вопрос. Куда бы он вернулся? Как бы я мог выполнить действие php, когда оно истекло? Или я должен перенаправить его? Это то, где я больше всего смущен. Большое спасибо!
  • 0
    Я изменил свой ответ, включив в него больше подробностей, чтобы вы могли выполнять соответствующую обработку ошибок при возникновении тайм-аута (или любой другой ошибки).
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню