function purge_issue_requests_curl in Purge 6
Same name and namespace in other branches
- 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;
}