public function testAddRequestAfterStart()
 {
     $multi_curl = new MultiCurl();
     $urls = array();
     $copy_of_urls = array();
     for ($i = 0; $i < 10; $i++) {
         $url = Test::TEST_URL . '?' . md5(mt_rand());
         $urls[] = $url;
         $copy_of_urls[] = $url;
     }
     $urls_called = array();
     $multi_curl->complete(function ($instance) use(&$multi_curl, &$urls, &$urls_called) {
         $urls_called[] = $instance->url;
         $next_url = array_pop($urls);
         if (!($next_url === null)) {
             $multi_curl->addGet($next_url);
         }
     });
     $multi_curl->addGet(array_pop($urls));
     $multi_curl->start();
     $this->assertNotEmpty($copy_of_urls);
     $this->assertNotEmpty($urls_called);
     $this->assertEquals(count($copy_of_urls), count($urls_called));
     foreach ($copy_of_urls as $url) {
         $this->assertTrue(in_array($url, $urls_called, true));
     }
 }
<?php

require __DIR__ . '/vendor/autoload.php';
use Curl\Curl;
use Curl\MultiCurl;
$multi_curl = new MultiCurl();
$multi_curl->success(function ($instance) {
    echo 'call to "' . $instance->url . '" was successful.' . "\n";
    echo 'response: ' . $instance->response . "\n";
});
$multi_curl->error(function ($instance) {
    echo 'call to "' . $instance->url . '" was unsuccessful.' . "\n";
    echo 'error code: ' . $instance->errorCode . "\n";
    echo 'error message: ' . $instance->errorMessage . "\n";
});
$multi_curl->complete(function ($instance) {
    echo 'call completed' . "\n";
});
$multi_curl->addGet('https://www.google.com/search', array('q' => 'hello world'));
$multi_curl->addGet('https://duckduckgo.com/', array('q' => 'hello world'));
$multi_curl->addGet('https://www.bing.com/search', array('q' => 'hello world'));
$multi_curl->start();
use Curl\MultiCurl;
$server_count = 10;
$urls = array();
$port = 8000;
for ($i = 0; $i < $server_count; $i++) {
    $port += 1;
    $urls[] = 'http://localhost:' . $port . '/';
}
$multi_curl = new MultiCurl();
$success = 0;
$error = 0;
$complete = 0;
$multi_curl->success(function ($instance) use(&$success) {
    $success += 1;
});
$multi_curl->error(function ($instance) use(&$error) {
    $error += 1;
});
$multi_curl->complete(function ($instance) use(&$complete) {
    $complete += 1;
});
$limit = 1000;
for ($i = 0; $i < $limit; $i++) {
    $url = $urls[mt_rand(0, count($urls) - 1)];
    $multi_curl->addGet($url);
}
$multi_curl->start();
echo 'complete: ' . $complete . "\n";
echo 'success: ' . $success . "\n";
echo 'error: ' . $error . "\n";
echo 'done' . "\n";
 public function testCurlCallbackOverride()
 {
     $multi_curl = new MultiCurl();
     $multi_curl->beforeSend(function () {
         PHPUnit_Framework_Assert::assertFalse(true);
     });
     $multi_curl->success(function () {
         PHPUnit_Framework_Assert::assertFalse(true);
     });
     $multi_curl->error(function () {
         PHPUnit_Framework_Assert::assertFalse(true);
     });
     $multi_curl->complete(function () {
         PHPUnit_Framework_Assert::assertFalse(true);
     });
     $delete_before_send_called = false;
     $delete_success_called = false;
     $delete_error_called = false;
     $delete_complete_called = false;
     $delete = $multi_curl->addDelete(Test::TEST_URL);
     $delete->beforeSend(function ($instance) use(&$delete_before_send_called) {
         $delete_before_send_called = true;
     });
     $delete->success(function ($instance) use(&$delete_success_called) {
         $delete_success_called = true;
     });
     $delete->error(function ($instance) use(&$delete_error_called) {
         $delete_error_called = true;
     });
     $delete->complete(function ($instance) use(&$delete_complete_called) {
         $delete_complete_called = true;
     });
     $download_before_send_called = false;
     $download_success_called = false;
     $download_error_called = false;
     $download_complete_called = false;
     $download_file_path = tempnam('/tmp', 'php-curl-class.');
     $download = $multi_curl->addDownload(Test::TEST_URL, $download_file_path);
     $download->beforeSend(function ($instance) use(&$download_before_send_called) {
         $download_before_send_called = true;
     });
     $download->success(function ($instance) use(&$download_success_called) {
         $download_success_called = true;
     });
     $download->error(function ($instance) use(&$download_error_called) {
         $download_error_called = true;
     });
     $download->complete(function ($instance) use(&$download_complete_called) {
         $download_complete_called = true;
     });
     $get_before_send_called = false;
     $get_success_called = false;
     $get_error_called = false;
     $get_complete_called = false;
     $get = $multi_curl->addGet(Test::TEST_URL);
     $get->beforeSend(function ($instance) use(&$get_before_send_called) {
         $get_before_send_called = true;
     });
     $get->success(function ($instance) use(&$get_success_called) {
         $get_success_called = true;
     });
     $get->error(function ($instance) use(&$get_error_called) {
         $get_error_called = true;
     });
     $get->complete(function ($instance) use(&$get_complete_called) {
         $get_complete_called = true;
     });
     $head_before_send_called = false;
     $head_success_called = false;
     $head_error_called = false;
     $head_complete_called = false;
     $head = $multi_curl->addHead(Test::TEST_URL);
     $head->beforeSend(function ($instance) use(&$head_before_send_called) {
         $head_before_send_called = true;
     });
     $head->success(function ($instance) use(&$head_success_called) {
         $head_success_called = true;
     });
     $head->error(function ($instance) use(&$head_error_called) {
         $head_error_called = true;
     });
     $head->complete(function ($instance) use(&$head_complete_called) {
         $head_complete_called = true;
     });
     $options_before_send_called = false;
     $options_success_called = false;
     $options_error_called = false;
     $options_complete_called = false;
     $options = $multi_curl->addOptions(Test::TEST_URL);
     $options->beforeSend(function ($instance) use(&$options_before_send_called) {
         $options_before_send_called = true;
     });
     $options->success(function ($instance) use(&$options_success_called) {
         $options_success_called = true;
     });
     $options->error(function ($instance) use(&$options_error_called) {
         $options_error_called = true;
     });
     $options->complete(function ($instance) use(&$options_complete_called) {
         $options_complete_called = true;
     });
     $patch_before_send_called = false;
     $patch_success_called = false;
     $patch_error_called = false;
     $patch_complete_called = false;
     $patch = $multi_curl->addPatch(Test::TEST_URL);
     $patch->beforeSend(function ($instance) use(&$patch_before_send_called) {
         $patch_before_send_called = true;
     });
     $patch->success(function ($instance) use(&$patch_success_called) {
         $patch_success_called = true;
     });
     $patch->error(function ($instance) use(&$patch_error_called) {
         $patch_error_called = true;
     });
     $patch->complete(function ($instance) use(&$patch_complete_called) {
         $patch_complete_called = true;
     });
     $post_before_send_called = false;
     $post_success_called = false;
     $post_error_called = false;
     $post_complete_called = false;
     $post = $multi_curl->addPost(Test::TEST_URL);
     $post->beforeSend(function ($instance) use(&$post_before_send_called) {
         $post_before_send_called = true;
     });
     $post->success(function ($instance) use(&$post_success_called) {
         $post_success_called = true;
     });
     $post->error(function ($instance) use(&$post_error_called) {
         $post_error_called = true;
     });
     $post->complete(function ($instance) use(&$post_complete_called) {
         $post_complete_called = true;
     });
     $put_before_send_called = false;
     $put_success_called = false;
     $put_error_called = false;
     $put_complete_called = false;
     $put = $multi_curl->addPut(Test::TEST_URL);
     $put->beforeSend(function ($instance) use(&$put_before_send_called) {
         $put_before_send_called = true;
     });
     $put->success(function ($instance) use(&$put_success_called) {
         $put_success_called = true;
     });
     $put->error(function ($instance) use(&$put_error_called) {
         $put_error_called = true;
     });
     $put->complete(function ($instance) use(&$put_complete_called) {
         $put_complete_called = true;
     });
     $multi_curl->start();
     $this->assertTrue($delete_before_send_called);
     $this->assertTrue($delete_success_called);
     $this->assertFalse($delete_error_called);
     $this->assertTrue($delete_complete_called);
     $this->assertTrue($download_before_send_called);
     $this->assertTrue($download_success_called);
     $this->assertFalse($download_error_called);
     $this->assertTrue($download_complete_called);
     $this->assertTrue(unlink($download_file_path));
     $this->assertTrue($get_before_send_called);
     $this->assertTrue($get_success_called);
     $this->assertFalse($get_error_called);
     $this->assertTrue($get_complete_called);
     $this->assertTrue($head_before_send_called);
     $this->assertTrue($head_success_called);
     $this->assertFalse($head_error_called);
     $this->assertTrue($head_complete_called);
     $this->assertTrue($options_before_send_called);
     $this->assertTrue($options_success_called);
     $this->assertFalse($options_error_called);
     $this->assertTrue($options_complete_called);
     $this->assertTrue($patch_before_send_called);
     $this->assertTrue($patch_success_called);
     $this->assertFalse($patch_error_called);
     $this->assertTrue($patch_complete_called);
     $this->assertTrue($post_before_send_called);
     $this->assertTrue($post_success_called);
     $this->assertFalse($post_error_called);
     $this->assertTrue($post_complete_called);
     $this->assertTrue($put_before_send_called);
     $this->assertTrue($put_success_called);
     $this->assertFalse($put_error_called);
     $this->assertTrue($put_complete_called);
 }
 public function testSequentialId()
 {
     $completed = array();
     $multi_curl = new MultiCurl();
     $multi_curl->complete(function ($instance) use(&$completed) {
         $completed[] = $instance;
     });
     for ($i = 0; $i < 100; $i++) {
         $multi_curl->addPost(Test::TEST_URL, $i);
     }
     $multi_curl->start();
     foreach ($completed as $instance) {
         $sequential_id = $instance->getOpt(CURLOPT_POSTFIELDS);
         $this->assertEquals($sequential_id, $instance->id);
     }
 }
 public function testAddRequestAfterStart()
 {
     $this->markTestSkipped('Callbacks not permitted at this time.  SugarCRM disallows the use of call_user_func[_array]');
     $multi_curl = new MultiCurl();
     $urls = array();
     $copy_of_urls = array();
     for ($i = 0; $i < 10; $i++) {
         $url = Test::TEST_URL . '?' . md5(mt_rand());
         $urls[] = $url;
         $copy_of_urls[] = $url;
     }
     $urls_called = array();
     $multi_curl->complete(function ($instance) use(&$multi_curl, &$urls, &$urls_called) {
         $urls_called[] = $instance->url;
         $next_url = array_pop($urls);
         if (!($next_url === null)) {
             $multi_curl->addGet($next_url);
         }
     });
     $multi_curl->addGet(array_pop($urls));
     $multi_curl->start();
     $this->assertNotEmpty($copy_of_urls);
     $this->assertNotEmpty($urls_called);
     $this->assertEquals(count($copy_of_urls), count($urls_called));
     foreach ($copy_of_urls as $url) {
         $this->assertTrue(in_array($url, $urls_called, true));
     }
 }