如何调试curl GET占用太多时间?

时间:2016-08-02 13:00:56

标签: php laravel curl salesforce

我最近将我的laravel应用与salesforce API相关联。 我的测试salesforce帐户中有大约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
]

为了改善这一点,我应该考虑什么?

我现在正在接受任何建议。

2 个答案:

答案 0 :(得分:1)

问题不在于卷曲,而在于您要为要检索的每个资源(患者)制作单独的 HTTP请求。在评论中,您声明无法索引或列出所有患者。我觉得这很奇怪,因为它是一个标准的REST操作,Salesforce是非常受欢迎的软件。您应该进一步查看文档,或者联系Salesforce以确保是这种情况。

如果您确实无法为所有患者编制索引并且需要提出个别请求,那么您无法做很多事情来加快API的使用,因此您必须研究其他方法。您可以做的一件事是使用Scheduled Tasks每隔x分钟/小时/天在后台更新您的数据库,从根本上创建Salesforce患者的本地缓存。这样,当您的用户访问您的应用程序时,就没有延迟,您可以在后台更新数据库,但需要经常更新。

答案 1 :(得分:1)

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