如何调试curlGET占用了太多时间


How to debug curl GET take up too much time?

我最近将我的laravel应用程序与salesforce API链接。我的测试销售人员账户中大约有146名患者。我注意到卷曲会持续很长时间。我不确定是不是因为我的卷发做错了。


我试过了

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秒,这只是简单的数据。


cURL信息

这是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
]

为了改进这一点,我应该研究什么?

我现在愿意接受任何建议。

问题不在于curl,而在于您正在为要检索的每个资源(患者)发出单独的HTTP请求。在评论中,您表示无法索引或列出所有患者。我觉得这很奇怪,因为这是一个标准的REST操作,Salesforce是一个非常流行的软件。您应该进一步查看文档,或者联系Salesforce以确保情况确实如此。

如果你确实无法为所有患者编制索引,并且需要提出单独的请求,那么你就无法加快API的使用速度,因此你必须研究其他方法。您可以做的一件事是使用Scheduled Tasks在后台每x分钟/小时/天更新一次数据库,本质上是创建Salesforce患者的本地缓存。这样,当您的用户访问您的应用程序时就不会有延迟,并且您可以在后台更新数据库,无论您需要多么频繁。

只需将患者的额外字段添加到原始查询中,例如SELECT Id,Name,foo__c FROM Patients__c,就可以放弃所有循环和卷曲。