Curl y diferentes peticiones/conexiones

Iniciado por dimitrix, 9 Septiembre 2014, 17:14 PM

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

dimitrix

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!




#!drvy

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

dimitrix

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...




Graphixx

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
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

JorgeEMX

Cita de: 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

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).

dimitrix

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...




JorgeEMX

Cita de: 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...

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 (php) [Seleccionar]
    /**
     * Ejecuta el envío de parametros a la página especificada
     * en el parametro 'url'.
     *
     * @param string $url
     * @param bool $execute
     */
function forward($url, $execute = true) {
$max = sizeof($this->params);
$str = "";

foreach ($this->params as $key => $value) {
$str .= "<input name=\"{$key}\" type=\"hidden\" value=\"{$value}\">";
}

$html =
"<html>".
"<head>".
"<script>".
"function post_forward() {".
($execute ? "document.getElementById(\"post_form\").submit();" : "").
"}".
"</script>".
"</head>".
"<body onload=\"post_forward()\">".
"<form id=\"post_form\" name=\"post_form\" method=\"{$this->method}\" action=\"$url\" target=\"{$this->target}\">".
"$str".
"</form>".
"</body>".
"</html>";
print $html;
}


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.

MinusFour

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 (php) [Seleccionar]

curl_multi_info_read


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 (php) [Seleccionar]

function call_url($url) {
   // Call the url and return immediately with the length of the data read.
   // Useful for firing off scripts by calling a url.

   $fp = fopen($url, 'r');
   stream_set_blocking($fp, 0); // 0 => non-blocking mode
   $data = fread($fp, 8192); // 1024 * 8 = 8192
   fclose($fp);

   // Return the amount of data read
   return strlen($data);
}


Recomiendo cURL sobre fopen si lo tienes.

JorgeEMX

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/

dimitrix

CitarAcaso 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 :-)




Cita de: JorgeEMX en 15 Septiembre 2014, 00:28 AM
Indagando un poco, parece otra muy buena opción usar stream_select

De nuevo gracias por la info :-)