AnsweredAssumed Answered

Speeding up Canvas API

Question asked by Lucas Ames on Feb 24, 2016
Latest reply on Jun 27, 2018 by Stuart Ryan

I'm having some trouble with some development work for our classes using the Canvas API that is likely a beginner's issue.


The gist of the problem centers on my requests timing out.  This could be a very newbie error, but it seems like my calls to the API (for current grade, missing assignments, last activity), bring in way more data that I need.  I am not sure if this is what is slowing it down but it doesn't seem that I can even limit my calls to simply return the single fields I need (e.g. current_score).  I use a Curl GET function that was posted here in the community a while back.


I am currently running PHP scripts via cron each morning.  The load is about 40 classes and 600 students but I'm even at the point where I'm running 10 classes/150 students.


Any thoughts would be appreciated.


// The following function covers any API request using GET  
function curlGet($url) {  
    global $canvasURL, $tokenHeader;  
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_URL, 'https://' . $canvasURL . '/api/v1/' . $url); 
   // echo "https://$canvasURL/api/v1/$url"; 
    curl_setopt ($ch, CURLOPT_HTTPHEADER, $tokenHeader);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // ask for results to be returned  
    curl_setopt($ch, CURLOPT_VERBOSE, 1); //Requires to load headers  
    curl_setopt($ch, CURLOPT_HEADER, 1);  //Requires to load headers  
    $result = curl_exec($ch);  
    // var_dump($result);  
    #Parse header information from body response  
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);  
    $header = substr($result, 0, $header_size);  
    $body = substr($result, $header_size);  
    $data = json_decode($body);  
    #Parse Link Information  
    $header_info = http_parse_headers($header);  
        $links = explode(',', $header_info['Link']);  
        foreach ($links as $value) {  
            if (preg_match('/^\s*<(.*?)>;\s*rel="(.*?)"/', $value, $match)) {  
                $links[$match[2]] = $match[1];