You are here

function purge_issue_requests_curl in Purge 6

Same name and namespace in other branches
  1. 7 purge.inc \purge_issue_requests_curl()

Issue purge request using curl

1 call to purge_issue_requests_curl()
purge_urls in ./purge.inc
Purges urls from reverse proxy caches

File

./purge.inc, line 94
Contains the main purging functionality and error handling

Code

function purge_issue_requests_curl($purges) {

  // Initialise a curl_multi object
  $curl_purges = curl_multi_init();
  $current_curl_purge = 0;
  foreach ($purges as $purge) {
    $curl_purge[$current_curl_purge] = curl_init();
    curl_setopt($curl_purge[$current_curl_purge], CURLOPT_CUSTOMREQUEST, $purge['request_method']);
    curl_setopt($curl_purge[$current_curl_purge], CURLOPT_URL, $purge['purge_url']);
    curl_setopt($curl_purge[$current_curl_purge], CURLOPT_HEADER, 1);
    curl_setopt($curl_purge[$current_curl_purge], CURLOPT_HTTPHEADER, $purge['headers']);
    curl_setopt($curl_purge[$current_curl_purge], CURLOPT_RETURNTRANSFER, 0);
    curl_multi_add_handle($curl_purges, $curl_purge[$current_curl_purge]);
    $current_curl_purge++;
  }

  // Execute the purge requests
  ob_start();
  do {

    // This loop is only necessary for libcurl earlier than 7.20.0, however
    // RHEL 5 has just that. Otherwise a simple call would do.
    do {
      $multi_result = curl_multi_exec($curl_purges, $active);
    } while ($multi_result == CURLM_CALL_MULTI_PERFORM);

    // Block until there is activity on any of the handlers. Avoids
    // busywaiting.
    if ($multi_result == CURLM_OK) {

      // According to https://bugs.php.net/bug.php?id=63411, in PHP 5.3.18+
      // curl_multi_select can return immediately if libcurl cannot block, but
      // still has something to process, so we block a bit ourselves.
      if (curl_multi_select($curl_purges) == -1) {

        // Wait 0.1 second.
        usleep(100000);
      }
    }
    if ($multi_result != CURLM_OK || $select_result == -1) {

      // @TODO: error handling. Something truly awkward happened.
      ob_end_clean();
      return FALSE;
    }
  } while ($select_result != -1 && $active && $multi_result == CURLM_OK);
  ob_end_clean();

  // Result collection. Collects the http code returned for each url purged
  $current_curl_purge = 0;
  foreach ($purges as $purge) {
    $info = curl_getinfo($curl_purge[$current_curl_purge]);
    $purges[$current_curl_purge]['http_code'] = $info['http_code'];
    curl_multi_remove_handle($curl_purges, $curl_purge[$current_curl_purge]);
    $current_curl_purge++;
  }
  curl_multi_close($curl_purges);
  return $purges;
}