CURL como gestor de descargas con múltiples conexiones y visualización de progreso en PHP

StackOverflow https://stackoverflow.com/questions/1613926

  •  06-07-2019
  •  | 
  •  

Pregunta

Quería usar la extensión CURL para PHP para crear algún tipo de administrador de descargas y pensaba que si CURL permitía implementar estas 2 características en las que estoy pensando:

1) Múltiples conexiones o descargas multiparte, como un administrador de descargas de aplicaciones de escritorio normal.

2) Actualice constantemente en la pantalla (texto o gráfico, no importa) el progreso de la descarga.

¿CURL para PHP permite algo de esto? Si es así, ¿te gustaría dar algunos consejos?

¿Fue útil?

Solución

Las funciones curl_multi_xyz (), como curl_multi_exec () le permite procesar múltiples solicitudes al mismo tiempo. También eche un vistazo a CURLOPT_RANGE si desea descargar Segmentos múltiples del mismo archivo en paralelo. Y las funciones de devolución de llamada que puede configurar con CURLOPT_READFUNCTION y < a href = "http://docs.php.net/function.curl-setopt" rel = "nofollow noreferrer"> CURLOPT_WRITEFUNCTION le permitiría enviar algún tipo de datos de progreso a el cliente.

Otros consejos

Para todos los " PHP no es ideal para tareas múltiples " críticos:

Retroceda un paso y considere que tiene a su disposición un increíble marco de trabajo multihilo si está en un entorno LAMP. Utilice esta arquitectura base para su ventaja, es decir, Apache es el administrador de subprocesos múltiples, y es muy bueno en eso.

Es muy fácil configurar PHP para que funcione en este entorno.

  
      
  1. Establezca max_execution_time = 0 para permitir que los scripts se ejecuten indefinidamente
  2.   
  3. Establezca ignore_user_abort = true para permitir que los scripts se ejecuten incluso después de   el cliente ha abortado
  4.   

Diseñar servicios web REST ligeros de una sola tarea. Diseñelas de tal manera que no le importe cuando regresen, como en un sistema de tipo de cola. Escribir en la cola es seguro para subprocesos y la eliminación de la cola es seguro para subprocesos si se realiza con algunas exclusiones mutuas básicas del sistema operativo.

" bifurcación " Los servicios web son tan simples como abrir un archivo:

fclose (fopen (" http: //somewebservice....php? a1 = v1 & amp; a2 = v2 & amp; .... "))); // Iniciar un servicio web y continuar ...

Este enfoque no solo es multiproceso, sino que también se distribuye de forma inherente. El servicio web puede ser local o localizado en todo el mundo. PHP ciertamente no le importa.

Para un sistema básico, lo único que lo retiene es la cantidad de subprocesos que permite apache. De lo contrario, su código está listo para aprovechar el equilibrio de carga y todos los demás trucos que las implementaciones avanzadas de Apache tienen para ofrecer.

Muy a menudo cuando el desarrollador piensa " multiproceso " piensan que "OMG tengo que manejar las bifurcaciones y los ejecutivos y las esperas y los PID". Y si diseñas tu sistema de esa manera, tienes razón, se vuelve muy complicado muy rápidamente. Retrocede y usa lo que está dado. ¿Tienes acceso a directorios? Boom - tienes colas. ¿Puedes emitir llamadas web? Boom: tienes una aplicación multiproceso (distribuida). Ahora simplemente fusione los conceptos según lo dicte su aplicación.

PHP no es multiproceso y, si intenta forzarlo como tal por medio de múltiples llamadas a archivos o forking, los resultados suelen ser subóptimos. Yo sugeriría que, en contra de esto, SIN EMBARGO, sería posible hacer algo como esto con una mezcla de js, php (aunque probablemente no sea curl sino un php personalizado flujo de archivos ), y sondeo largo

Es posible, eche un vistazo a curl_multi_init ();

No, ese no es el caso. No es posible porque el administrador de descargas llama a la clase que maneja la descarga 5 veces, es decir, una instancia de clase PHP.

Esta es una llamada de clase de muestra:

$tr = new teConnections();
$data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming); 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top