#!/usr/bin/env php curlMultiHandle = curl_multi_init(); } function addHandle($curlHandle) { curl_multi_add_handle($mh, $curlHandle); } } $active = null; function curl_multi_loop_scheduler($mh, callable $done) { $mrc = curl_multi_exec($mh, $active); switch ($mrc) { /** * From the curl docs. If CURM_CALL_MULTI_PERFORM is returned, simply * call curl_multi_perform immediately again. In PHP this means we * actually call curl_multi_exec immediately again. * * We're doing this in the next tick. */ case CURLM_CALL_MULTI_PERFORM : Loop\nextTick(function() use ($mh, $done) { curl_multi_loop_scheduler($mh, $done); }); break; case CURLM_OK : if (!$active) { // We're done! $done(); return; } // Check again after 0.02 seconds Loop\setTimeout(function() use ($mh, $done) { curl_multi_loop_scheduler($mh, $done); }, 0.02); break; default : throw Exception('Curl error: ' . curl_multi_strerror($mrc)); } } curl_multi_loop_scheduler($mh, function() { echo "Success!\n"; }); Loop\run(); //close the handles curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);