public function curl_multi($requests)
{
$curl_multi = curl_multi_init();
foreach ($requests as $req) {
if (defined('PURGE_SERVER_TYPE') && 'mangle' == PURGE_SERVER_TYPE) {
$data = array('group' => 'vip-go', 'scope' => 'global', 'type' => $req['method'], 'uri' => $req['host'] . $req['uri'], 'cb' => 'nil');
$json = json_encode($data);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, constant('PURGE_SERVER_URL'));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($json)));
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($curl_multi, $curl);
} else {
// Purge HTTP
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://{$req['ip']}{$req['uri']}");
curl_setopt($curl, CURLOPT_PORT, $req['port']);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Host: {$req['host']}", "X-Forwarded-Proto: http"));
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $req['method']);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_multi_add_handle($curl_multi, $curl);
// Purge HTTPS
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://{$req['ip']}{$req['uri']}");
curl_setopt($curl, CURLOPT_PORT, $req['port']);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Host: {$req['host']}", "X-Forwarded-Proto: https"));
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $req['method']);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_multi_add_handle($curl_multi, $curl);
}
}
$running = true;
while ($running) {
do {
$result = curl_multi_exec($curl_multi, $running);
} while ($result == CURLM_CALL_MULTI_PERFORM);
if ($result != CURLM_OK) {
error_log('curl_multi_exec() returned something different than CURLM_OK');
}
curl_multi_select($curl_multi, 0.2);
}
while ($completed = curl_multi_info_read($curl_multi)) {
$info = curl_getinfo($completed['handle']);
if (!$info['http_code'] && curl_error($completed['handle'])) {
error_log('Error on: ' . $info['url'] . ' error: ' . curl_error($completed['handle']));
}
if ('200' != $info['http_code']) {
error_log('Request to ' . $info['url'] . ' returned HTTP code ' . $info['http_code']);
}
curl_multi_remove_handle($curl_multi, $completed['handle']);
}
curl_multi_close($curl_multi);
}