Re: Remote File download is very slow

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Okay, I attached the code. Not everyone will click the paste bin link. :P

the code is a downloading function of a class.
the class has some methods need to be explained.
1) $this->debugMessage, it sends message to a call back function to a caller

2) $this->doCallback, sends the amount of bytes read to a call back function
to the caller\
3) $this->localfilename is the file where the remote file will be downloaded

4) $this->lfp is localfilepointer
5) read_chunk_size = 512
6) $headers is a predefined array of headers
7) $postdata is the url encoded data to send by post method.

Here is the code....
_________________________________________________________________________
    $this->lfp = fopen($this->localfilename,"wb");

            if($this->lfp===false){return false;}

            if(function_exists('fsockopen')){
                  $pu = parse_url($this->download_url);
                  $request="POST {$pu['path']} HTTP/1.1\r\n";
                  $request.="Host: {$pu['host']}\r\n";
                  $request.="Content-type:
application/x-www-form-urlencoded\r\n";
                  $request.=implode("\r\n",$headers)."\r\n";
                  $request.="Connection: close\r\n";
                  $request.="Content-length: ".strlen($postdata)."\r\n\r\n";


                  $sock = fsockopen($pu['host'],80,$errno,$errstr);

                  fwrite($sock,$request);

                  $this->debugMessage("Headers Sent\r\n".$request);

                  fwrite($sock,$postdata);

                  $headers="";
                  do{
                        $headers.=fread($sock,128);
                  }while(strpos($headers,"\r\n\r\n")===false);

                  $pos = strpos($headers,"\r\n\r\n");
                  $headers = split("\r\n\r\n",$headers);
                  $headers = $headers[0];

                  $this->debugMessage("Headers recieved".$headers."\r\n");
                  $this->debugMessage("Downloading started. . .\r\n");
                  $content = substr($headers,$pos+4);
                  if($content!==false){
                        $this->doCallback(fwrite($this->lfp,$content));
                  }
                  while(!feof($sock)){

$this->doCallback(fwrite($this->lfp,fread($sock,$this->read_chunk_size)));

                  }
                  $this->debugMessage("Download finished\r\n");

                  fclose($sock);

            }else {
                  $ch = curl_init();
                  curl_setopt($ch, CURLOPT_URL,$this->download_url);
                  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                  if(!empty($this->cookiefile)){
                        curl_setopt($ch, CURLOPT_COOKIEFILE,
$this->cookiefile);
                        curl_setopt($ch, CURLOPT_COOKIEJAR,
$this->cookiefile);
                  }
                  curl_setopt($ch,CURLOPT_FILE,$this->lfp);
                  curl_setopt($ch, CURLOPT_POST,1);
                  curl_setopt($ch, CURLOPT_POSTFIELDS,$postdata);

                  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

                  curl_exec($ch);
                  curl_close($ch);
            }
            fclose($this->lfp);
_________________________________________________________________________

-- 
Blog: http://talk.cmyweb.net/
Follow me: http://twitter.com/shiplu

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux