2016-08-02 66 views
0

我最近將我的laravel應用程序與salesforce API連接起來。 我的測試salesforce帳戶中有大約146位患者。我注意到捲曲是永遠存在的。我不確定是否因爲我的捲髮做錯了事。如何調試curl GET佔用太多時間?


我已經試過

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的

我捕捉到的加載時間,它需要大約25秒加載頁面,它僅僅是簡單的數據。


捲曲信息

這是我的foreach循環的第一個對象的結果。

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 
] 

我應該看看,以提高該怎麼辦?

我打開任何建議現在。

+0

你有什麼時機?捲曲請求?數據的解析?頁面的渲染?或只是完整的頁面加載時間? – NDM

+0

它可能是由於curl操作在foreach循環中。無論如何,你使用批量ID進行單一卷曲調用? –

+0

@NDM:我會用所有這些信息更新我的帖子。 – ihue

回答

1

問題不在於捲曲,而是因爲您正在爲要檢索的每個資源(病人)提供單獨的 HTTP請求。在評論中,你聲明無法索引或列出所有患者。我覺得這很奇怪,因爲它是標準的REST操作,Salesforce是非常流行的軟件。您應該仔細閱讀文檔,或者聯繫Salesforce以確保是這種情況。

如果你確實不能索引所有的病人和需要作出個別要求,那麼就沒有什麼可以做,以加快您的API的消耗,所以你將不得不考慮其他方法。有一兩件事你可以做的是使用Scheduled Tasks在後臺更新數據庫每x分鐘/小時/天,基本上是建立您的Salesforce患者的本地緩存。這樣,當用戶訪問您的應用程序時就不會有延遲,並且您可以經常地在後臺更新數據庫。

+0

我可以根據開藥者ID索引所有患者。所以首先這就是爲什麼我列出所有預訂者以獲得ID,然後遍歷這些ID,並使每個curl都成爲「https://na3.salesforce.com/services/data/v37.0/sobjects/Patients__c/」 '。$ id'可以獲得關於每位患者的更多詳細信息。我不知道如何elses,我會這樣做。 – ihue

+0

但是絕對感謝您的回答,它絕對讓我有些想法。 – ihue

+0

沒問題。既然如此,那麼您應該將自己的API作爲自動化任務處理,並將其保存到應用程序可以訪問的數據庫中。它不僅會爲用戶加載速度更快,而且會爲您的服務器節省大量資源:) – samrap

1

只需添加你從病人想你的原始查詢,例如額外的領域那麼你可以把所有的循環和捲曲放在一起。

+0

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

+0

當然,我會嘗試。非常感謝你們的時間和建議。 :D – ihue

+0

您的建議非常棒!它工作的延遲不再發生。但是,如何在1個查詢中查詢「整個」患者對象。你建議的只是一個ID。我想要關於病人的所有信息。 – ihue