2016-08-02 33 views
0

Ich habe kürzlich meine Laravel-App mit der Salesforce-API verknüpft. Ich habe etwa 146 Patienten in meinem Test Salesforce-Konto. Ich habe bemerkt, dass die Locke ewig dauert. Ich bin mir nicht sicher, ob ich etwas falsch gemacht habe.Wie Debuggen curl GET nehmen zu viel Zeit?


Ich habe

versucht
public static function patients(){ 

     try { 
      $records = Salesforce::query('SELECT Id FROM Patients__c')->records; 
      if(is_array($records)){ 
       $data = []; 
       $session_id = Salesforce::getSessionID(); 

       foreach ($records as $i=>$record) { 
        $id = $record->Id; 
        $url = 'https://na3.salesforce.com/services/data/v37.0/sobjects/Patients__c/'.$id; 

        $ch = curl_init(); 
        $timeout = 1; 
        curl_setopt($ch, CURLOPT_URL, $url); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
         "Authorization: Bearer ".$session_id)); 
        $result = curl_exec($ch); 
        curl_close($ch); 
        $result = json_decode($result, true); 
        $data[$i] = $result; 
       } 

      }else{ 
       return $data; 
      } 

     } catch (Exception $e) { 
      Log::error($e->getMessage()); 
      die($e->getMessage() . $e->getTraceAsString()); 
     } 

     return $data; 
    } 

Wireshark

ich die Ladezeit zu erfassen, ist es etwa 25 Sekunden dauern, um die Seite zu laden, und es ist nur die einfachen Daten.


cURL Info

Dies ist das Ergebnis des ersten Objekts meiner foreach-Schleife.

array:26 [▼ 
    "url" => "https://na3.salesforce.com/services/data/v36.0/sobjects/Patients__c/a005000000f0M3YAAU -H "Authorization: Bearer ******"" 
    "content_type" => null 
    "http_code" => 400 
    "header_size" => 47 
    "request_size" => 256 
    "filetime" => -1 
    "ssl_verify_result" => 0 
    "redirect_count" => 0 
    "total_time" => 0.569035 
    "namelookup_time" => 0.001719 
    "connect_time" => 0.085617 
    "pretransfer_time" => 0.26601 
    "size_upload" => 0.0 
    "size_download" => 10.0 
    "speed_download" => 17.0 
    "speed_upload" => 0.0 
    "download_content_length" => -1.0 
    "upload_content_length" => -1.0 
    "starttransfer_time" => 0.568458 
    "redirect_time" => 0.0 
    "redirect_url" => "" 
    "primary_ip" => "136.147.43.333" 
    "certinfo" => [] 
    "primary_port" => 443 
    "local_ip" => "10.20.100.333" 
    "local_port" => 59777 
] 

Was sollte ich in, um diese zu verbessern?

Ich bin im Moment auf alle Vorschläge öffnen.

+0

Was haben Sie festgelegt? die Curl-Anfrage? das Parsen der Daten? das Rendern der Seite? oder nur die komplette Seitenladezeit? – NDM

+0

Es ist wahrscheinlich aufgrund der Curl-Operation in einer foreach-Schleife. Wie auch immer, du machst einen einzigen Anruf mit Massen-IDs? –

+0

@NDM: Ich werde meine Post mit all diesen Infos aktualisieren. – ihue

Antwort

1

Das Problem ist nicht mit curl, aber mit der Tatsache, dass Sie eine separate HTTP-Anfrage für jede Ressource (Patient), die Sie abrufen möchten. In den Kommentaren erklären Sie, dass es keine Möglichkeit gibt, alle Patienten zu indizieren oder aufzulisten. Ich finde das merkwürdig, da es sich um eine Standard-REST-Operation handelt und Salesforce eine extrem beliebte Software ist. Sie sollten sich die Dokumente näher ansehen oder sich an Salesforce wenden, um sicherzustellen, dass dies der Fall ist.

Wenn Sie tatsächlich nicht alle Patienten indizieren können und individuelle Anfragen stellen müssen, dann können Sie nicht viel tun, um den Konsum der API zu beschleunigen. Sie müssen sich also andere Methoden ansehen. Eine Sache, die Sie tun können, ist die Verwendung Scheduled Tasks, um Ihre Datenbank im Hintergrund alle x Minuten/Stunden/Tage zu aktualisieren, im Wesentlichen einen lokalen Cache Ihrer Salesforce-Patienten erstellen. Auf diese Weise wird es keine Latenz geben, wenn Ihre Benutzer auf Ihre Anwendung zugreifen, und Sie können die Datenbank im Hintergrund jedoch häufig aktualisieren.

+0

Ich kann alle Patienten anhand der Verschreiber-ID indizieren.Also zuerst, das ist der Grund, warum ich alle Verordner auflisten muss, um die ID zu bekommen, und dann diese IDs durchlaufen und jede Wellung auf "https://na3.salesforce.com/services/data/v37.0/sobjects/Patients__c/ '. $ id', um mehr Details über jeden Patienten zu erhalten. Ich bin mir nicht sicher, wie es geht, das würde ich tun. – ihue

+0

Aber definitiv danke für Ihre Antwort, es gibt mir definitiv etwas zum Nachdenken. – ihue

+0

Kein Problem. In diesem Fall sollten Sie den API-Verbrauch im Hintergrund als eine automatisierte Aufgabe behandeln und in einer Datenbank speichern, auf die Ihre Anwendung zugreifen kann. Nicht nur wird es schneller für den Benutzer geladen, aber es wird Ihren Server eine Tonne Ressourcen speichern :) – samrap

1

Fügen Sie einfach die zusätzlichen Felder, die Sie von Patient zu Ihrer ursprünglichen Abfrage, z. SELECT Id,Name,foo__c FROM Patients__c dann können Sie alle Schleifen und Curling alle zusammen Graben.

+0

soql docs https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm – superfell

+0

Sicher, ich werde das versuchen. Vielen Dank für Ihre Zeit und Ihren Vorschlag. : D – ihue

+0

Ihre Vorschläge sind fantastisch! Es funktioniert, die Latenz tritt nicht mehr auf. Aber wie frage ich das "gesamte" Patientenobjekt innerhalb einer Abfrage ab. Was Sie vorgeschlagen haben, war nur eine ID. Ich möchte alle Informationen über den Patienten. – ihue