Home  »  PHP  »  Downloading Multiple Files with Curl Simultaneously

by 5 comments

Wouldn't it be great if you could use php and curl to download multiple files simultaneously using built-in curl functions? You can!

Example Code

Note that this won't work out of the box or anything, I was passing this function an array containing a bunch of mod_rewrite variables, but you can get an idea of how to use the code.

function curlit_rewritecond($U,$pass){
    global $RPASS,$RSITE;
    $FF_HDR=array("Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
  "Accept-Language: en-us,en;q=0.9,de;q=0.8,ja;q=0.8,zh;q=0.7,zh-cn;q=0.6,nl;q=0.5,fr;q=0.5,it;q=0.4,ko;q=0.3,es;q=0.2,ru;q=0.2,pt;q=0.1",
  "Accept-Encoding: gzip,deflate","Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7","Keep-Alive: 300","Connection: keep-alive","Pragma:");
    if($fp = tmpfile()){
        $mh = curl_multi_init();
        foreach ($U as $i => $ur) {
            if (!$url_info = parse_url($url)) die('bad url '.$url);
            $ch[$i] = curl_init($url);
            curl_setopt ($ch[$i], CURLOPT_HEADERFUNCTION, 'aacurlheader');
            curl_setopt ($ch[$i], CURLOPT_HEADER, 1);
            curl_setopt ($ch[$i], CURLOPT_VERBOSE, 0);
            curl_setopt ($ch[$i], CURLOPT_NOBODY, 1);
            curl_setopt ($ch[$i], CURLOPT_CUSTOMREQUEST, 'GET');
            curl_setopt ($ch[$i], CURLOPT_STDERR, $fp);
            curl_setopt ($ch[$i], CURLOPT_FAILONERROR, 0);
            curl_setopt ($ch[$i], CURLOPT_FOLLOWLOCATION, 0);
            curl_setopt ($ch[$i], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: Gecko/20070914 Firefox/ (via');
            curl_setopt ($ch[$i], CURLOPT_INTERFACE, '');
            curl_setopt ($ch[$i], CURLOPT_HTTPHEADER, $FF_HDR);
            curl_setopt ($ch[$i], CURLOPT_REFERER, '');
            curl_setopt ($ch[$i], CURLOPT_ENCODING, 0);
            curl_setopt ($ch[$i], CURLOPT_CONNECTTIMEOUT, 45);
            curl_setopt ($ch[$i], CURLOPT_MAXCONNECTS, 5);
            curl_setopt ($ch[$i], CURLOPT_MAXREDIRS, 0);
            curl_multi_add_handle ($mh,$ch[$i]);
        do { ob_start();$r=curl_multi_exec($mh,$active);$t=ob_get_clean();}
    while($r == CURLM_CALL_MULTI_PERFORM || $active);
    if ($r != CURLM_OK) die("Curl multi read error $r");
        foreach ($U as $i => $url) {
      if (curl_errno($ch[$i])) {echo curl_error($ch[$i])."-".curl_errno($ch[$i]);}
      //else $cch=curl_getinfo($ch[$i]);
  return true;

php code example 2

This code will download all the files listed in the $urls array to the folder specified by the $saveto variable.

$mh = curl_multi_init();
foreach ($urls as $i => $url) {
        $fp[$i]=fopen ($g, "w");
        curl_setopt ($conn[$i], CURLOPT_FILE, $fp[$i]);
        curl_setopt ($conn[$i], CURLOPT_HEADER ,0);
        curl_multi_add_handle ($mh,$conn[$i]);
do {
while ($active);
foreach ($urls as $i => $url) {
    fclose ($fp[$i]);

Curl Multi Functions

Returns a new cURL multi handle
Add a normal cURL handle to a cURL multi handle
Run the sub-connections of the current cURL handle
Close a set of cURL handles
Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set
Get information about the current transfers
Get all the sockets associated with the cURL extension, which can then be "selected"
Remove a multi handle from a set of cURL handles


September 5th, 2007

Comments Welcome

  • Raghu Veer

    this code works fine. I had tested with different files of different file sizes :)

  • Dirk Hooghe

    I am searching a way to give the user the possibility to download multiple files (midi files) on their hard disk. The second script I use to do this but it is only working when I run it from my local computer (local apache server). When I execute it from my website it won't work.
    I used


    to go to the local drive. Has anybody a solution?

  • omi

    if the browser is closed downloading is also stop so how do we use shell_exec command so that if the browser is closed it does not effect my downloading?

  • Hemant Arora

    Works fine for files with binary data. But, I was unable to upload PHP files through this script, as when I did, the files uploaded were either 0kb in size or had some php error as content. This is happening because the script executes the PHP code inside each file I transfer and saves the output as content of downloaded file. Please advise a solution. Thanks a lot.

  • eservicesindia

    how to improve cache or performance in curl

My Online Tools
WordPress Sites

My Picks

Related Articles
Newest Posts

  • The Hacker Playbook - very nice high level overview of attacks 
  • Clean Code - A Handbook of Agile Software Craftsmanship 
  • Secrets of the JavaScript Ninja - By my absolute favorite JS hacker John Resig! 
  • Hacking Exposed 7: Network Security Secrets & SolutionsMy all time favorite, basic but thorough and accurate. 
  • Empty words will be no surrogate for cold resolve. Pain is nothing. 
  • REVERSING: Secrets of Reverse Engineering 
  • "The Shockwave Rider", by John Brunner (1975 hacker sci-fi) 
  • The Rootkit ARSENAL - Escape and Evasion in the Dark Corners of the System 
  • "We Are Anonymous - Inside the Hacker World of LulzSec, Anonymous, and the Global Cyber Insurgency" better be good! 
  • The Datacenter as a Computer -- Urs Holzle 
  • Now by Steven Levy, "IN THE PLEX" 
  • Dreaming in code.... So far, a little boring, but worth the read 

Friends and Recommends
Hacking and Hackers

The use of "hacker" to mean "security breaker" is a confusion on the part of the mass media. We hackers refuse to recognize that meaning, and continue using the word to mean someone who loves to program, someone who enjoys playful cleverness, or the combination of the two. See my article, On Hacking.
-- Richard M. Stallman


It's very simple - you read the protocol and write the code. -Bill Joy

Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 3.0 License, just credit with a link.
This site is not supported or endorsed by The Apache Software Foundation (ASF). All software and documentation produced by The ASF is licensed. "Apache" is a trademark of The ASF. NCSA HTTPd.
UNIX ® is a registered Trademark of The Open Group. POSIX ® is a registered Trademark of The IEEE.

| Google+ | askapache

Site Map | Contact Webmaster | License and Disclaimer | Terms of Service

↑ TOPMain