PHP, Fast scrapping with PHP CLI and no extensions

 Published On June 19, 2016

Hace muy poquito, leyendo por ahí me encontré un post en thebot.net/threads/battle-net-name-number-scraper.368348/#post-4088269 donde pedían algo y otro usuario hizo un script en PHP para resolver el asunto, publicado en http://pastebin.com/bxDjQQdJ

Estaba bien… pero le faltaban threads, y más tarde ví que también le faltaba eliminar los resultados duplicados. En resumen, 50 consultas http una detrás de otra, todo un poco lento.

Haciendo memoria recordé como se hacían los threads al viejo estilo usando 2 ficheros, sólo que lo he unido y estoy usando un único fichero dividido en 2 partes. Debido a que es fácil diferenciar los parámetros obtenidos por CLI ($argv) respecto a los del servidor ($_POST, $_GET ó $_REQUEST), es fácil saber si es una llamada normal o la llamada especial del thread, por lo que en principio el script es compatible tanto en servidor como en CLI.

Pthreads es una Extension de PHP que te permite usar threads en PHP, pero no va de esto… porque me puse hace un rato y no he podido instalarlo sin cargarme algunas librerías, ahora me dice que necesito PHP7 y yo le he dicho adiós y sigo con mi PHP5.6. Así que usando viejos trucos he montado una versión un poco mejor, con threads al estilo cavernícola, llevando un control de cada PID lanzado y esperando a su finalización para mostrar de nuevo los resultados.

Actualmente guardo todo en results.txt, y al leerlo elimino los duplicados dejando los correctos. Algunas veces el gestor de escritura en disco hace de las suyas y escribe con algún segundo de delay, por lo que he añadido un pequeño sleep() final por si las moscas.

Algunos resultados obtenidos de la web presentaban un error de codificación que se resuelven fácilmente con iconv.

Otras opciones para evitar el delay son:

  • Base de datos, como pueden ser sqlite3 o redis-server.
  • PThreads, que necesitas instalarla con pecl (php-pear).
  • Ramdisk, eso es, un disco creado en la Ram.
  • Usando $_SESSION y guardando ahí los datos.

Sólo he hecho esto para ver cuánto tiempo menos tardaba al pasarlo por subprocesos y la verdad es que es increible la de tiempo que se pierde esperando por cosas en fila india.


Tags:

Comments:

comments powered by Disqus