Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: dimitrix en 9 Septiembre 2014, 17:14 pm



Título: Curl y diferentes peticiones/conexiones
Publicado por: dimitrix en 9 Septiembre 2014, 17:14 pm
Hola a todos!

Os explico, tengo un proyecto y la parte que nos importa del proyecto tiene dos ficheros:

index.php // Llama al fichero curl
curl.php   //  Parsea una web y la guarda en la base de datos

El problema es que que tiene que parsear constantemente webs (tipo bot) y claro hasta que no termina una no pasa a la siguiente...

Así que me gustaría saber cual es la forma más correcta y óptima para que index.php realice 50 peticiones a curl.php, para que se vayan ejecutando 50 curl.php en segundo plano.

Se hacerlo de diferentes formas, pero no creo que sea lo más óptimo ¿Cómo lo haríais vosotros?

Un saludo!


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: #!drvy en 9 Septiembre 2014, 17:31 pm
La verdad es que aquí te vendrían bien threads aunque PHP no esta digamos al nivel de eso xD

Sin embargo, has pensado en utilizar multi_curl ?
http://curl.haxx.se/libcurl/php/examples/multi.html

Saludos


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: dimitrix en 9 Septiembre 2014, 22:39 pm
Cuando llegue a casa lo miro, lo que he pensado es hacer algún script .sh que ejecute 50 ficheros por Curl... voy a ver esta noche...


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: Graphixx en 10 Septiembre 2014, 17:06 pm
No se si hacer multiples llamadas desde index a curl sirva, dejo esto por aqui:
Hacer un POST Dinamico en PHP [Hacer Post a dos paginas php]
http://foro.elhacker.net/php/hacer_un_post_dinamico_en_php_hacer_post_a_dos_paginas_php-t421006.0.html


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: JorgeEMX en 14 Septiembre 2014, 06:09 am
No se si hacer multiples llamadas desde index a curl sirva, dejo esto por aqui:
Hacer un POST Dinamico en PHP [Hacer Post a dos paginas php]
http://foro.elhacker.net/php/hacer_un_post_dinamico_en_php_hacer_post_a_dos_paginas_php-t421006.0.html

No sirve de absolutamente nada.

Para el tema principal, yo te recomendaría algún lenguaje que soporte arquitectura orientada a eventos (como lo es NodeJS, tengo entendido que con Python y Ruby también es posible).


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: dimitrix en 14 Septiembre 2014, 18:29 pm
JorgeEMX hay mil maneras de hcaerlo con PHP, tanto con Shell Script como con cron, lo único que digo es que hay que ver cual es la mejor manera...


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: JorgeEMX en 14 Septiembre 2014, 21:31 pm
JorgeEMX hay mil maneras de hcaerlo con PHP, tanto con Shell Script como con cron, lo único que digo es que hay que ver cual es la mejor manera...

Acaso viste de que va la librería que se menciona en el otro tema??

A lo que me refiero que cómo lo están usando en el otro topic no es viable, ya que las llamadas se ejecutan en el orden en que ha sido escritas y hasta que no termina una empieza otra. Aquí te pongo el método principal, y que hace el request, de dicha librería:

Código
  1.    /**
  2.      * Ejecuta el envío de parametros a la página especificada
  3.      * en el parametro 'url'.
  4.      *
  5.      * @param string $url
  6.      * @param bool $execute
  7.      */
  8. function forward($url, $execute = true) {
  9. $max = sizeof($this->params);
  10. $str = "";
  11.  
  12. foreach ($this->params as $key => $value) {
  13. $str .= "<input name=\"{$key}\" type=\"hidden\" value=\"{$value}\">";
  14. }
  15.  
  16. $html =
  17. "<html>".
  18. "<head>".
  19. "<script>".
  20. "function post_forward() {".
  21. ($execute ? "document.getElementById(\"post_form\").submit();" : "").
  22. "}".
  23. "</script>".
  24. "</head>".
  25. "<body onload=\"post_forward()\">".
  26. "<form id=\"post_form\" name=\"post_form\" method=\"{$this->method}\" action=\"$url\" target=\"{$this->target}\">".
  27. "$str".
  28. "</form>".
  29. "</body>".
  30. "</html>";
  31. print $html;
  32. }

Y si quieres algo realmente eficaz para manejar múltiples llamadas usa algún lenguaje de programación que soporte la arquitectura que te comento.


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: MinusFour en 14 Septiembre 2014, 23:08 pm
Multi curl es una buena idea:

http://php.net/manual/en/function.curl-multi-init.php

Citar
Allows the processing of multiple cURL handles in parallel.

Incluso puedes implementar callbacks con:

Código

Otra forma de hacerlo es con el modo non-blocking de los streams:

http://darklaunch.com/2013/03/23/php-non-blocking-fopen-file-get-contents-using-stream-set-blocking

Código
  1. function call_url($url) {
  2.    // Call the url and return immediately with the length of the data read.
  3.    // Useful for firing off scripts by calling a url.
  4.  
  5.    $fp = fopen($url, 'r');
  6.    stream_set_blocking($fp, 0); // 0 => non-blocking mode
  7.    $data = fread($fp, 8192); // 1024 * 8 = 8192
  8.    fclose($fp);
  9.  
  10.    // Return the amount of data read
  11.    return strlen($data);
  12. }

Recomiendo cURL sobre fopen si lo tienes.


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: JorgeEMX en 15 Septiembre 2014, 00:28 am
Indagando un poco, parece otra muy buena opción usar stream_select http://php.net/manual/es/function.stream-select.php . Viene con PHP por defecto al parecer y en algunos artículos sacados de Google hablan de muy buenos resultados. A mi me ha dado curiosidad y voy hacer algunas pruebas (según entiendo hasta procesos del sistema puedes hacer en paralelo).

http://wezfurlong.org/blog/2005/may/guru-multiplexing/


Título: Re: Curl y diferentes peticiones/conexiones
Publicado por: dimitrix en 15 Septiembre 2014, 01:52 am
Citar
Acaso viste de que va la librería que se menciona en el otro tema??

Sí, lo ví, pero creo que no te expresaste con claridad.

Gracias por el código.



MinusFour gracias por lo de los callbacks, aunque no lo necesito es más que interesante :-)



Indagando un poco, parece otra muy buena opción usar stream_select

De nuevo gracias por la info :-)