CURL como um gerenciador de downloads com múltiplas conexões e exibir o progresso em PHP

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu queria usar a extensão CURL para PHP para criar algum tipo de gerenciador de download e eu estava pensando se CURL permitido para implementar estas 2 características que eu estou pensando em:

1) Múltiplas ligações ou de download multi-parte apenas como um gerenciador de download de aplicações desktop normal.

2) atualizar constantemente na tela (texto ou gráfico, não importa) o progresso do download.

O CURL para PHP permite que nada disso? Se assim for, o cuidado de fornecer algumas dicas?

Foi útil?

Solução

O curl_multi_xyz () funções, como curl_multi_exec() permitem múltipla processo solicita ao mesmo tempo. Também dê uma olhada CURLOPT_RANGE se você quiser fazer download de vários segements do mesmo arquivo em paralelo. E as funções de retorno de chamada que pode configurar com CURLOPT_READFUNCTION e CURLOPT_WRITEFUNCTION lhe permitiria enviar algum tipo de dados de progresso para o cliente.

Outras dicas

Para todos os "PHP não é grande para-multitarefa" críticos:

Dê um passo para trás e considerar que você tem uma estrutura incrível Multithreading à sua disposição se você estiver em um ambiente LAMP. Use esta arquitetura base para a sua vantagem - ou seja Apache é o multi-threading gerente -. E um muito bom naquele

É muito fácil de configurar PHP para trabalhar neste ambiente.

  1. Set max_execution_time = 0 para permitir a execução de scripts indefinatly
  2. Set ignore_user_abort = true para permitir a execução de scripts, mesmo após a cliente tem abortado

Projeto leves single-Tarefa de Serviços Web REST. Projetá-los de tal forma a que você não se importa quando eles retornam, como em um sistema de tipo de fila. Escrevendo para a fila é thread-safe e remoção da fila é thread-safe, se feito com alguns semáforos básicos de nível OS.

"bifurcação" os serviços da web é tão simples como abrir um arquivo:

fclose(fopen("http://somewebservice....php?a1=v1&a2=v2&....")); // Launch a web service and continue...

Não é só esta abordagem multi-threaded, mas é inerentemente distribuídos também. O serviço web pode ser local ou localizados em todo o mundo. PHP certamente não se importa.

Para um sistema básico a única coisa que o impede é o número de threads que apache permite. Caso contrário o seu código está pronto para tirar vantagem de balanceamento de carga e todos os outros truques que avançaram implementações Apache tem a oferecer.

Muitas vezes, quando desenvolvedor pensar "multi-threaded" eles pensam "OMG eu tenho que garfos punho e executivos e esperas e PIDs". E se você projetar seu sistema dessa forma - você está certo, ele fica muito complicado muito rapidamente. Passo para trás e uso que é dado. Você tem acesso a diretórios? Boom - você tem filas. Você pode emitir chamadas web? Boom - você tem um aplicativo multi-threaded (distribuído). Agora é só mesclar os conceitos juntos como seus ditames de aplicativos.

PHP não é multi-threaded e, se você tentar forçá-lo como tal por meio de várias chamadas de arquivos ou bifurcação, os resultados são geralmente sub-óptima. Eu sugeriria contra isso, no entanto, seria possível fazer algo assim com uma mistura de js, php (provavelmente não enrolar embora, mas um php personalizado arquivo de fluxo ) e longo polling

É possível, dar uma olhada em curl_multi_init ();

Não, isso não é caso. Não é possível porque gerenciador de download chama a classe que lida baixar 5 vezes - que é instância de classe PHP.

Esta é uma chamada de classe de exemplo:

$tr = new teConnections();
$data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top