PHP Class Curl Multi Example
<?php
$cm = new CurlMulti();
$cm->add("http://example.com/somelargefile1.zip",'./somelargefile1.zip');
$cm->add("http://example.com/somelargefile2.zip",'./somelargefile2.zip');
$cm->add("http://example.com/somelargefile3.zip",'./somelargefile3.zip');
$cm->add("http://example.com/somelargefile4.zip",'./somelargefile4.zip');
$cm->fetchAll();
?><?php
class CurlMulti
{
private $curl_multi_handle = null;
private $curl_handles = array();
public function __construct()
{
$this->curl_multi_handle = curl_multi_init();
}
public function __destruct()
{
foreach($this->curl_handles as $dest=>$curl_handle)
{
curl_multi_remove_handle($this->curl_multi_handle, $curl_handle);
}
curl_multi_close($this->curl_multi_handle);
}
public function add($url,$dest,$options = array())
{
file_put_contents($dest,'');//write stub
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, $url);
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
foreach($options as $k=>$v)
{
//curl_setopt($ch1, $k, $v);
}
$this->curl_handles[ $dest ] = $ch1;
curl_multi_add_handle($this->curl_multi_handle, $ch1);
}
public function fetchAll()
{
$mh = &$this->curl_multi_handle;
$active = null;
//execute the handles
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
foreach($this->curl_handles as $dest=>$curl_handle)
{
$content = curl_multi_getcontent($curl_handle);
file_put_contents($dest,$content);
}
}
}code snippets are licensed under Creative Commons CC-By-SA 3.0 (unless otherwise specified)
|