Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme Oderdenge

Atualizar aplicativo através do PHP

Recommended Posts

Olá!

 

Tenho um aplicativo que é atualizado frequentemente, e para não obrigar meus clientes à instalarem/baixarem manualmente estas atualizações, gostaria de saber o que é necessário fazer para que o PHP baixe arquivos de um servidor e os atualize automaticamente na pasta raíz do aplicativo.

 

Humanamente falando: Que dia bonito hoje, ein? Epa... que isso? O (servidor) oráculo está me mandando alguma informação... vamos ver... » Opa! Uma atualização na área. Vou perguntar se o cliente quer atualizar... » Ótimo! Ele quer atualizar. Vamos baixar e substituir os arquivos... » Atualização finalizada!

 

Dei uma pesquisada na internet e nada encontrei.

 

Desde já, grato.

Abraços! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem um outro topico aki falando sobre isso, eh so dar uma pesquisada, mas eh simples, você monta a estrutura do seu aplicativo muito bem organizado, dae você le um zip, por exemplo do seu servidor, baixa o zip, com o file_get_contents usando o file_binary, depois você dezipa ( o php tem classe nativa pra zip) e apaga os antigos e coloca os novos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu imagino que tenha algo na internet, mas não faço ideia de como pesquisar. Já tentei utilizar termos como: atualizador em php ou auto-atualizador em php, mas nada. As respostas são muito genéricas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto mais específico o problema, menor a chance de encontrar pronto.

 

Você pode trabalhar como o Igor falou ou individualmente, arquivo por arquivo.

 

Eu acho que individualmente é mais inteligente pois seria mais leve e rápido para o cliente, pois você estaria fornecendo um updater do aplicativo inteiro e não de pequenos sub-sistemas (como os plugins do WordPress).

 

Em adotando-se o segundo cenário, você iteraria recursivamente pela estrutura de diretórios do release candidate que você desenvolveu e montaria uma lista contendo: nome do arquivo, hash e o path onde ele será salvo. Opcionalmente você pode fornecer o tamanho do arquivo, versão (com data e tudo o mais) e, quem sabe o grau de severidade do update.

 

Então você monta a lista de arquivos, com um checkbox ao lado de cada arquivo.

 

Ao clicar no botão Update você computa a diferença entre a matriz que você gerou e a àquela com as escolhas de update do usuário (vai que ele não tem tempo de atualizar tudo).

 

Você envia essa lista do servidor do cliente para o seu servidor e começa a fazer as atualizações.

 

Antes de atualizar você cria um backup dos arquivos, no próprio cliente, como segurança. Copia o arquivo, substitui e checa o hash do novo arquivo se bate com o esperado.

 

Se bater, continua para o próximo.

 

Mas, o mais importante de tudo isso é que o atualizador deve ser 100% independente do seu sistema. Se ele usar algum recurso do sistema, durante o update o próprio atualizador pode ser prejudicado e, então, forçaria o cliente a um update manual.

 

Se houver necessidade de parte do processo ser manual, você instrui o usuário e explica o motivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Bruno. Obrigado pela resposta!

 

Se algum momento eu expressei ou dei entender que eu queria algo pronto, me desculpe. Eu não quero algo pronto, eu quero apenas uma luz - basicamente como essa que você me deu.

 

Na teoria eu consigo fazer o aplicativo - mas o procedimento de código, como o de acessar o meu servidor, é que eu não consigo. Em outras palavras: qual função do PHP consegue conectar à um servidor remoto? Se eu entender e conseguir manipular isso, o resto eu, quem sabe, consiga me virar.

 

De qualquer forma, obrigado ao Igor e a você.

 

Um abraço! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, se pareceu que eu disse que você disse que queria algo pronto, então me desculpe. A intenção que tive é que quanto mais específico for um problema, menos soluções vai encontrar. Infelizmente, é a verdade.

 

Você disse que sabe fazer o atualizador, que é justamente a parte mais complicada do que precisa, tramitar a lista do cliente para o seu servidor é bobeira.

 

Você pode fazer da forma mais simples, com file_get_contents() usando uma Stream Context para que você defina algumas opções, dentre elas, o tipo POST e seus respectivos valores.

 

Ou com cURL, se estiver mais familiarizado. Agora se você quiser um negócio parrudo, pode implementar um webservice de verdade, mas aí o buraco é bem mais embaixo. ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, eu faria algo do tipo: Cliente, Servidor

 

  1. Envia uma requisição pro servidor, verificando se há novas atualizações para a superior versão atual

  2. Se houver novas atualizações, envia uma requisição de liberação desses pacotes

  3. Quando a requisição é recebida no servidor, procura pela versão solicitada na lista de atualizações

  4. Se houver arquivos para atualizar, emite de volta uma string serilializada com cada conteúdo de arquivo e nome

  5. Quando todos os arquivos forem atingidos, altera a versão atual para aguardar por novas atualizações

 

Eu prefiro implementar um WebService, como sugerido pelo Bruno Augusto, por questões mesmo de autenticação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Senhores, obrigado pelas respostas. Só me expliquem uma coisa: como posso fazer o PHP reconhecer que um arquivo é mais atualizado que outro?

 

No caso, como fazer o PHP entender quando e o que tem que atualizar.

 

Tô processando aqui o atualizador, mas estou bem preso nessa parte...

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem um outro topico aki falando sobre isso, eh so dar uma pesquisada, mas eh simples, você monta a estrutura do seu aplicativo muito bem organizado, dae você le um zip, por exemplo do seu servidor, baixa o zip, com o file_get_contents usando o file_binary, depois você dezipa ( o php tem classe nativa pra zip) e apaga os antigos e coloca os novos...

 

eh so montar um arqivo de config, e pegar no seu config a versao atual e comparar no servidor, se no servidor foi maior você vaixa e instala...eh simples procura no manual sobre operadores de comparacao...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sério que a lógica é "só" essa? Oo

 

Mas deves pensar que não é todo arquivo que eu vou querer atualizar. Se eu fazer atualizações em arquivos específicos, vou querer atualizar somente aqueles arquivos. Imagine o quão pesado ficaria baixar o app inteiro toda vez que surgir uma atualização...

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sério que a lógica é "só" essa? Oo

 

Mas deves pensar que não é todo arquivo que eu vou querer atualizar. Se eu fazer atualizações em arquivos específicos, vou querer atualizar somente aqueles arquivos. Imagine o quão pesado ficaria baixar o app inteiro toda vez que surgir uma atualização...

 

Abraço!

 

exatamente...você nao precisa liberar uma atualizacao pra tudo, pode liberar pra alguns arquivos....por isso q eu enfatizo q a estrutura da aplicacao deve ser muito bem elaborada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não a lógica não é essa.

 

Você ao lançar um Service Pack ( :lol: ) pro seu sistema, vai incluir nele um determinado número de arquivos.

 

Antes mesmo de enviar a lista do arquivos atuais do usuário pro seu servidor, você envia uma requisição informando a versão que ele tem. Com base nessa informação você seleciona o pacote adequado e daí sim tramita a lista de arquivos.

 

Porém, existe a possibilidade da falha humana na qual você ao criar o Service Pack pode, por acidente, incluir um arquivo que não necessita de atualização, e é aí que entra a verificação do hash do mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eh so montar um arqivo de config, e pegar no seu config a versao atual e comparar no servidor, se no servidor foi maior você vaixa e instala...eh simples procura no manual sobre operadores de comparacao...

 

Errado, nem sempre uma atualização é para uma versão superior ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não importa se está indo pra cima (upgrade) ou para baixo (downgrade). Substituiu o arquivo é uma atualização.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não a lógica não é essa.

 

Você ao lançar um Service Pack ( :lol: ) pro seu sistema, vai incluir nele um determinado número de arquivos.

 

Antes mesmo de enviar a lista do arquivos atuais do usuário pro seu servidor, você envia uma requisição informando a versão que ele tem. Com base nessa informação você seleciona o pacote adequado e daí sim tramita a lista de arquivos.

 

Porém, existe a possibilidade da falha humana na qual você ao criar o Service Pack pode, por acidente, incluir um arquivo que não necessita de atualização, e é aí que entra a verificação do hash do mesmo.

 

Você desencadeou a lógica na minha cabeça. Putz, cara, não sei nem como te agradecer hauahuahua. Agora só quero ver colocar isso em prática. Preciso entender como comunicar 2 servidores diferentes - um para perguntar, outro para responder. Posso usar cURL pra isso né?

 

---------------------

 

Igor e Andrey: valeu pelas respostas... vocês são duas figuras! HEAUHEUAEHUA

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas qua a dificuldade cara.

 

O Updater, no cliente, abre uma requisição para um URL como faria para com qualquer outro site. Como eu disse, pode ser com file_get_contents() usando-se de Stream Context ou com cURL. Só que nesse caso o site será o seu servidor.

 

Assim como se um usuário acessasse esse link pelo browser, alguma rotina que você escreveu, no final das contas, faria um echo de alguma informação.

 

É a mesma coisa, porém tem uma etapa a mais, que você já deve ter feito em algum momento da sua vida. Depois que o servidor retorna a resposta, um usuário, pelo browser, iria continuar navegando, disparando novas requisições e recebendo novas respostas.

 

Quando você consome um serviço programaticamente, nos moldes de um webservice ou não, você tem a resposta do servidor armazenada numa variável, daí pra frente você manipula.

 

Se você fizer sua aplicação retornar um JSON, o Updater vai decodificá-lo para ficar mais fácil de ler as informações.

 

Se retornar um XML, você vai analizá-lo e obter as informações.

 

Ou se for um simples echo na tela, você teria que separar cada fragmento de informação.

 

Na primeira requisição, disparada por digamos, um botão chamado Procurar por Atualizações você enviaria a versão do sistema atualmente em uso. Como Igor disse, isso poderia estar no arquivo de configuração que toda aplicação tem.

 

$settings = Registry::getInstance() -> get( 'settings' );

$context = stream_context_create(

   array(

       'http' => array(

           'method' => 'POST',
           'content' => spintf( 'version=%d', $settings -> version )
       )
   )
);

$versionResponse = file_get_contents( 'URL_DO_SERVIDOR', NULL, $context );

Seu servidor receberia verificaria se recebeu $_POST['version']. Se recebeu buscaria a próxima atualização e retornaria. Se não, retornaria um erro.

 

Mais abaixo no código acima, você analisaria a resposta. Suponhamos que estejamos trabalhando com JSON, prontos para integrar com AJAX:

 

$versionResponse = json_decode( $versionResponse );

if( ! is_null( $versionResponse ) ) {

   $newVersion = $versionResponse -> newVersion;

   /**
    * Agora faz tudo que o tópico já falou
    * Itera recursivamente pelos diretórios, monta a lista e repete o esquema de requisição acima
    * porém, agora, envia essa lista gerada (array) serializada
    */
}

Tá entendendo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.