3 votes

Réponse Curl incohérente de l'hôte local au site en ligne

Bonjour à tous J'ai un fichier php qui renvoie un JSON que j'ai construit à partir d'une réponse de curl. Mon problème est que lorsque je l'exécute sur le serveur local (localhost), la réponse JSON a une longueur de 55, ce qui est correct, il a obtenu tous les événements dont j'avais besoin. Mais quand je l'ai essayé sur notre site d'hébergement, la réponse est incohérente, elle est différente de celle de l'hôte local. Pour le premier chargement, j'ai vérifié la longueur de la réponse et elle renvoie 32 événements sur 55, puis j'ai essayé de la recharger à nouveau et la réponse est passée à 39, etc.

Voici la réponse de mon serveur local. [ [https://prnt.sc/rll4w0\]](https://prnt.sc/rll4w0]) . Voici le fichier hébergé sur le cpanel https://cdev.trilogycap.co/icedev/dynamic/civicore.php Voici la première réponse https://prnt.sc/rll2rc Et lorsque je recharge cette page à nouveau https://prnt.sc/rll3fl

Le processus de fonctionnement de mon fichier php est le suivant. J'ai une fonction qui récupère tous les identifiants des événements de cette année et les place dans le tableau global. J'ai supprimé les doublons. J'appelle maintenant une fonction pour multicurl.

Ainsi, pour chaque ID, je traiterai et appellerai à nouveau l'API et la construirai. Je l'ai ensuite poussé dans mon tableau de variables responseEvents dans global que j'ai ensuite encodé pour pouvoir faire un fichier JSON valide. Est-ce qu'il y a une connexion ou une mauvaise chose que j'ai faite dans mon multi curl ? Est-ce qu'il y a une limite d'exécution pour le multi curl de php ? Ou est-ce que le settimelimit(0) affecte mon code ?

Voici mon code

<?php
//Use this so that when we run the curl it wont timeout when dealing with getting data
set_time_limit(0);
$API_KEY  = "APIKEY";
$CURRENT_YEAR = date("Y");
$CURRENT_MONTH = date("m");
$CURRENT_DAY = date("d");
$events = getOpportunityYearly();//array of ID's removed duplicates [1,1,2,3,4,5 etc]
$noDuplicate =  array_values(array_unique($events));//remove $event ID duplciates
$responseEvents = [];//this is the array to be returned as json to use

//pass noDuplicate array which holds event ID's
multiCurl($noDuplicate);
print_r(json_encode($responseEvents, JSON_HEX_QUOT |  JSON_HEX_TAG | JSON_HEX_AMP |JSON_UNESCAPED_SLASHES ));

//returns an array of ID of events
function getOpportunityYearly(){
  $eventArr = [];//pass eventsID here
  $curl = curl_init();

  curl_setopt_array($curl, array(
      CURLOPT_URL => 'https://api.com/voc/api/v3/data/opportunities_dates?key='.$GLOBALS['API_KEY'].'&fields=["startDate","endDate","opportunities_id"]&where={"whereType":"AND","clauses":[{"fieldName":"startDate","operator":">=","operand":"'.$GLOBALS['CURRENT_YEAR'].'-'.$GLOBALS['CURRENT_MONTH'].'-'.$GLOBALS['CURRENT_DAY'].'"},{"fieldName":"endDate","operator":"<=","operand":"'.$GLOBALS['CURRENT_YEAR'].'-12-31"}]}',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "GET",
  ));

  //convert response to obj
  $response = json_decode(curl_exec($curl));
  curl_close($curl);
  $eventsID = $response->records;
  //print_r($eventsID);

  //every opportunity object get its id and push to events array
  foreach($eventsID as $opportunity){
    array_push($eventArr,$opportunity->opportunities_id->value);
  }
  return $eventArr;
}

function multiCurl($eventArray){
    // array of curl handles
    $multiCurl = array();

    // data to be returned
    $result = array();

    // multi handle
    $mh = curl_multi_init();
    $index = null;

    foreach ($eventArray as $event) {
        //$event are the ID per each event
        $multiCurl[$event] = curl_init();
        curl_setopt_array($multiCurl[$event], array(
          CURLOPT_URL =>'https://api.com/voc/api/v3/data/opportunities/'.$event.'?key='.$GLOBALS['API_KEY'].'&fields=["opportunityName","typeOfWork","firstDateInOpportunity","lastDateInOpportunity","startTime","endTime","physicalDifficulty","minimumAge","location","state","city","county","campingAvailable","groupsAllowed","registrationFormID","cRQ_payment","paymentAmount","additionalInformation","photo","displayToPublic","latitude","longitude","summary","description","photo"]&where={"whereType":"AND","clauses":[{"fieldName":"displayToPublic","operator":"checked"}]}',
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 0,
          CURLOPT_FOLLOWLOCATION => true,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "GET"
        ));
        curl_multi_add_handle($mh, $multiCurl[$event]);
    }

    do {
      curl_multi_exec($mh,$index);
    } while($index > 0);

      // get content and remove handles
      foreach($multiCurl as $key=>$value) {

        $records = json_decode(curl_multi_getcontent($value));//response of each request
        $record  = $records->records[0];

       if(strtolower($record->displayToPublic->displayValue) == 'yes'){
          $eve =  [ 
            "page_item_url"=> $record->opportunities_id->value,
              "data"=>[
                "typeOfWork"=>$record->typeOfWork->displayValue,
                "opportunityName"=> $record->opportunityName->displayValue,
                "firstDateInOpportunity"=> $record->firstDateInOpportunity->displayValue,
                "lastDateInOpportunity"=> property_exists($record, 'lastDateInOpportunity') ? $record->lastDateInOpportunity->displayValue : $record->firstDateInOpportunity->displayValue,
                "startTime"=>$record->startTime->displayValue,
                "endTime"=>$record->endTime->displayValue,
                "physicalDifficulty"=>$record->physicalDifficulty->displayValue,
                "minimumAge"=>$record->minimumAge->displayValue,
                "location"=>$record->location->displayValue,
                "state"=>$record->state->displayValue,
                "city"=>$record->city->displayValue,
                "county"=>$record->county->displayValue,
                "campingAvailable"=>$record->campingAvailable->displayValue,
                "groupsAllowed"=>$record->groupsAllowed->displayValue,
                "registrationFormID"=>$record->registrationFormID->displayValue,
                "cRQ_payment"=>$record->cRQ_payment->displayValue,
                "paymentAmount"=>$record->paymentAmount->displayValue,
                "photo"=>$record->photo->displayValue,
                "displayToPublic"=>$record->displayToPublic->displayValue,
                "latitude"=> property_exists($record, 'latitude') ? $record->latitude->displayValue : "0",
                "longitude"=> property_exists($record, 'longitude') ? $record->longitude->displayValue : "0",
                "photo"=>$record->photo->displayValue,
                "description"=> $record->description->displayValue,
                "additionalInformation"=> $record->additionalInformation->displayValue,
                "summary"=> $record->summary->displayValue
                ]
              ];
              array_push($GLOBALS["responseEvents"],$eve);
              curl_multi_remove_handle($mh, $value);
        }
      }//foreach
    curl_multi_close($mh);
}

?>

1voto

Will Points 814

Je pense que votre curl n'a pas reçu toutes les informations lors de la saisie de ce foreach. foreach($multiCurl as $key=>$value) Cela peut expliquer pourquoi cela fonctionne en local (réponse rapide) et pas sur votre serveur distant (temps de réseau, temps de réponse plus long).

Vous devriez essayer ceci, que j'obtiens de la documentation et doit attendre que toutes les connexions se terminent correctement.

do {
    $status = curl_multi_exec($mh, $index);
    if ($index) {
        // Wait a short time for more activity
        curl_multi_select($mh);
    }
} while ($index && $status == CURLM_OK);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X