Papadopolis

MultiCurl

Jul 4th, 2011
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.37 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Classes criadas por mim para utilizar em meus snippets
  5.  *
  6.  * @author: Pedro Prata L. Papadópolis
  7.  * @contact-twitter: @papadopolis
  8.  * @contact-messenger: [email protected]
  9.  *
  10.  *
  11.  * Algumas partes das classes são comentadas e a classe ainda está em fase BETA, não consegui deixar muito dinâmico o esquema pra setar as options do curl...
  12. */
  13. //Executar requisições HTTP simultâneas
  14. class MultiCurl {
  15.     public $urls       = array(); //Array que armazena as urls adicionadas
  16.     private $ch         = array(); //Handle curl (curl_init) das urls
  17.     private $setopt     = null;    //Índices curlopt adicionados via (curl_setopt_array)
  18.     private $execTime   = 0;
  19.     public  $same       = false;   //False: usa array_unique para retirar urls repetidas, True: executa urls mesmo repetidas
  20.     public  $erros      = array(); //Array de erros encontrados internamente
  21.     public  $data       = array(); //O conteúdo retornado pela classe fica armazenado nesta Array.
  22.    
  23.     function __construct() {
  24.         $this->setCurlopt();
  25.     }
  26.    
  27.     public function add() {
  28.         $urls = func_get_args();
  29.         $count = count($urls);
  30.  
  31.         $t=0;
  32.         do {
  33.             if($this->same)
  34.                 if(!in_array($urls[$t],$this->urls))
  35.                     $this->urls[] = $urls[$t];
  36.             else
  37.                 $this->urls[] = $urls[$t];
  38.             ++$t;
  39.         } while($t!==$count);
  40.     }
  41.    
  42.     public function setCurlopt(array $c = null, $f = null) {
  43.         if($c==null && $this->setopt == null) //Array de valores e índices de curlopt padrão.
  44.             $this->setopt = array(
  45.                 CURLOPT_RETURNTRANSFER => 1,
  46.                 CURLOPT_COOKIE => null,
  47.                 CURLOPT_HEADER => 0,
  48.                 CURLOPT_NOBODY => null,
  49.                 CURLOPT_FOLLOWLOCATION => 1,
  50.             );
  51.         else if($f!==null)
  52.             $this->setopt = array_merge($c,$this->setopt);                                
  53.         else
  54.             $this->setopt = $c;
  55.     }
  56.    
  57.     public function addHandle() {
  58.         $count = count($this->ch);
  59.        
  60.         $t=0;
  61.         while($t<$count) {
  62.             $this->setopt[CURLOPT_URL] = $this->urls[$t]; //URL à ser acessada é setada aqui
  63.             curl_setopt_array($this->ch[$t],$this->setopt);
  64.            
  65.             ++$t;
  66.         }
  67.     }
  68.    
  69.     function single($url,$setopt = null) {
  70.         $ch = curl_init();
  71.         if($setopt == null)
  72.             $this->setopt[CURLOPT_URL] = $url;
  73.         else
  74.             $this->setCurlopt($setopt);
  75.         @curl_setopt_array($ch,$this->setopt);
  76.         $output = @curl_exec($ch);
  77.         @curl_close($ch);
  78.         return $output;
  79.     }
  80.    
  81.     public function exec() {
  82.         $count = count($this->urls);
  83.        
  84.         $t=0;
  85.         while($t<$count) {
  86.             $this->ch[] = @curl_init();
  87.             ++$t;
  88.         }
  89.        
  90.         $this->addHandle();
  91.        
  92.         $mh = @curl_multi_init();
  93.         $t=0;
  94.         while($t<$count) {
  95.             @curl_multi_add_handle($mh,$this->ch[$t]);
  96.             ++$t;
  97.         }
  98.  
  99.         $nulo = null;
  100.         do {
  101.             $res = curl_multi_exec($mh,$nulo);
  102.             sleep($this->execTime);
  103.         } while ($nulo > 0);
  104.        
  105.         $t=0;
  106.         do {
  107.             $this->data[] = @curl_multi_getcontent($this->ch[$t]);
  108.             @curl_multi_remove_handle($mh,$this->ch[$t]);
  109.             ++$t;
  110.         } while ($this->ch[$t]!==null);
  111.        
  112.         return $this->data;
  113.     }
  114.    
  115.     public function setExecTime($t) {
  116.         $this->execTime = $t;
  117.     }
  118.    
  119.     //Não fiz um esquema pra mostrar erros dentro da classe, mas se quiser adicionar erros use esta função para guardá-los na Array $erros
  120.     private function addError($str) {
  121.         $this->erros[] = $str;
  122.     }
  123.    
  124.     public function debbug($var) {
  125.         $var = $this->{$var};
  126.         $tipo = gettype($var);
  127.        
  128.         if(is_array($var))
  129.             print_r(array_values($var));
  130.         else
  131.             echo $var;
  132.         echo var_dump($var);
  133.     }
  134.    
  135.     public function reset() {
  136.         $this->urls       = array();
  137.         $this->ch         = array();
  138.         $this->erros      = array();
  139.         $this->data       = array();
  140.     }
  141.    
  142.     public function getVar($var) {
  143.         $var = $this->{$var};
  144.         return $var;
  145.     }
  146. }
  147.  
  148. ?>
Advertisement
Add Comment
Please, Sign In to add comment