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!
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
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...
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
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).
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...
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:
/**
* 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.
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:
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
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.
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/
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 :-)