Duda curl y buffer php

Iniciado por mr-medi, 1 Marzo 2020, 21:28 PM

0 Miembros y 1 Visitante están viendo este tema.

mr-medi

Muy buenas, he conseguido mediante la librería de curl en php pintar los directorios encontrados dado un dominio de forma dinámica mediante el buffer de php, ya que sino lo haces así tienes que esperar a que se procesen todas las peticiones para que te pinte los resultados.

El código que muestro a continuación funciona a la perfección pero lo he estado intentando pasar a programación POO y no los pinta de forma dinámica, ¿alguien sabe a que se debe?

Buffer php => https://www.php.net/manual/en/function.ob-start.php


Código en programacion estructurada como prueba de concepto
Código (php) [Seleccionar]

<?php
$lista 
file_get_contents('lista.txt');
$directorios explode("\n" $lista);

foreach(
$directorios as $dir)
        
$list[] = trim("http://www.google.com/".$dir);

ob_implicit_flush(true);
ob_end_flush();
ob_start();
echo 
"<pre>";
echo 
"Loading ...";
ob_flush();
flush();
$directorios = array();
$rolling_window 100;
$rolling_window = (count($list) < $rolling_window) ? count($list) : $rolling_window;
$master curl_multi_init();
$curl_arr = array();
$std_options = array
(
    
CURLOPT_RETURNTRANSFER => true,
   
CURLOPT_FOLLOWLOCATION => true,
    
CURLOPT_USERAGENT => 'DHunter');
$options $std_options;
for (
$i 0$i $rolling_window$i++)
{
    
$ch curl_init();
    
$options[CURLOPT_URL] = $list[$i];
    
curl_setopt($chCURLOPT_HEADER0);
    
curl_setopt($chCURLOPT_PROGRESSFUNCTION,'progress');
    
curl_setopt($chCURLOPT_NOPROGRESSfalse);
    
curl_setopt_array($ch,$options);
    
curl_multi_add_handle($master$ch);
}
$i 0;
do
{
  while((
$execrun curl_multi_exec($master$running)) == CURLM_CALL_MULTI_PERFORM);
  if(
$execrun != CURLM_OK)
      break;
  while(
$done curl_multi_info_read($master))
  {
      
$info curl_getinfo($done['handle']);
      if (
$info['http_code'] == 200)
      {
          
$directorios[] = $info['url'];
          
$i++;
          echo  
$info['url']."<br>";
       }
      
$output curl_multi_getcontent($done['handle']);
      
$ch curl_init();
      
curl_setopt($chCURLOPT_PROGRESSFUNCTION,'progress');
      
curl_setopt($chCURLOPT_HEADER0);
      
curl_setopt($chCURLOPT_NOPROGRESSfalse);
      
curl_setopt_array($ch,$options);
      
curl_multi_add_handle($master$ch);
      
curl_multi_remove_handle($master$done['handle']);
      
$options[CURLOPT_URL] = $list[$i++];
  }
}while (
$running);
curl_multi_close($master);
echo 
"<br>Done";

function 
progress()
{
    
ob_flush();
    
flush();
}



Esta es la version de POO que no pinta los resultados de forma dinamica:
Clase BruterDirectory
Código (php) [Seleccionar]

<?php
    
class BruterDirectory extends Bruter
    
{
        private 
$directories;
        private 
$domain;
        public 
$handle;

        public function 
__construct($domain,$list)
        {
            
parent::__construct($list);
            
$this -> domain $domain;
            
$this -> directories = array();
        }

       public function 
doSearch()
       {
           
ob_implicit_flush(true);
           
ob_end_flush();
           
ob_start();
           echo 
"<pre>";
           echo 
"Loading ...";
           
ob_flush();
           
flush();
             
$directorios = array();
             
$rolling_window 100;
             
$rolling_window = (count($this -> list) < $rolling_window) ? count($this -> list) : $rolling_window;
             
$master curl_multi_init();
             
$curl_arr = array();
             
$std_options = array
             (
                 
CURLOPT_RETURNTRANSFER => true,
                 
CURLOPT_FOLLOWLOCATION => true,
                 
//CURLOPT_MAXREDIRS => 2,
                 
CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Windows; Windows10_64bits; rv:72.0) Gecko/20100101 Firefox/72.0');
             
$options $std_options;
             for (
$i 0$i $rolling_window$i++)
             {
               
$ch curl_init();
               
$options[CURLOPT_URL] = $this -> list[$i];
               
curl_setopt($chCURLOPT_HEADER0);
               
curl_setopt($chCURLOPT_PROGRESSFUNCTION,array($this'progress'));
               
curl_setopt($chCURLOPT_NOPROGRESSfalse);
               
curl_setopt_array($ch,$options);
               
curl_multi_add_handle($master$ch);
             }
             
$i 0;
             do
             {
               while((
$execrun curl_multi_exec($master$running)) == CURLM_CALL_MULTI_PERFORM);
               if(
$execrun != CURLM_OK)
                   break;
               while(
$done curl_multi_info_read($master))
               {
                   
$info curl_getinfo($done['handle']);
                   if (
$info['http_code'] == 200)
                   {
                       
$directorios[] = $info['url'];
                       
$i++;
                       echo  
$info['http_code']."<br>";
                    }
                   
$output curl_multi_getcontent($done['handle']);
                   
$ch curl_init();
                   
curl_setopt($chCURLOPT_PROGRESSFUNCTION, array($this'progress'));
                   
curl_setopt($chCURLOPT_HEADER0);
                   
curl_setopt($chCURLOPT_NOPROGRESSfalse);
                   
curl_setopt_array($ch,$options);
                   
curl_multi_add_handle($master$ch);
                   
curl_multi_remove_handle($master$done['handle']);
                   
$options[CURLOPT_URL] = $this -> list[$i++];
               }
           }while (
$running);
         
curl_multi_close($master);
         echo 
"<br>Done";
         return 
$directorios;
       }

       public function 
progress()
       {
           
ob_flush();
           
flush();
       }


Y la llamada al metodo "doSearch" en el fichero main.php
Código (php) [Seleccionar]

$domain="http://www.google.com";
$list = file_get_contents('lista.txt');
$directorios = explode("\n" , $list);
foreach($directorios as $dir)
       $urls[] = trim($domain.$dir);
$bruterDir = new BruterDirectory($domain,$urls);
dirs = $bruterDir -> doSearch();


Cualquier sugerencia es bienvenida.

<?php
       header
("Location: TheHackerWay");