CURL como um gerenciador de downloads com múltiplas conexões e exibir o progresso em PHP
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?
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.
- Set max_execution_time = 0 para permitir a execução de scripts indefinatly
- 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);