Carregamentos muito grandes com PHP

Quero permitir uploads de arquivos muito grandes em nosso aplicativo PHP (cem de megas – 8 shows). Há, no entanto, alguns problemas com isso.

Navegador:

  • Os carregamentos de HTML têm comentários ruins, precisamos fazer uma pesquisa para o progresso (o que é um pouco bobo) ou não mostrar nenhum comentário
  • O carregador de flash coloca todo o arquivo na memory antes de iniciar o upload

Servidor:

  • O PHP nos obriga a definir o post_max_size, o que pode resultar em um ataque DOS facilmente executável. Eu não gostaria de definir esta configuração globalmente.
  • O servidor também exige que algumas outras variables ​​estejam no POST vars, como uma chave secreta. Gostaríamos de poder recusar o pedido imediatamente, em vez de depois de todo o arquivo ser carregado.

Requisitos:

  • HTTP é uma obrigação.
  • Sou flexível com a tecnologia do lado do cliente, desde que funcione em um navegador.
  • O PHP não é um requisito, se houver alguma outra tecnologia que funcione bem em um ambiente linux, isso é perfeitamente legal.

Como sobre um applet Java? Foi assim que tivemos que fazê-lo em uma empresa pela qual trabalhei anteriormente. Eu sei que os applets sugam, especialmente neste dia e idade com todas as nossas opções disponíveis, mas eles realmente são a solução mais versátil para problemas de desktop encontrados no desenvolvimento web. Apenas algo a considerar.

upload_max_filesize pode ser definido por diretório por diretório ; o mesmo vale para post_max_size

por exemplo:

 php_value upload_max_filesize 10G php_value post_max_size 10G  

Python Handler?

Usando um manipulador Python POST em vez de PHP. Gere um identificador exclusivo do seu aplicativo PHP para que o cliente possa colocar os headers HTTP. Com o mod_python para rejeitar ou aceitar o upload grande antes que todo o corpo POST seja transmitido.

Eu acho que http://www.modpython.org/live/current/doc-html/dir-handlers-hph.html

Permite verificar headers e recusar o resto da input POST. Não tentei, mas pode ser o caminho certo?

Olhando para a fonte do mod_python, o buffer da input via read () parece permitir uma avaliação do bit-at-a-time da input HTTP. Os headers são os primeiros.

https://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c

É velho, eu sei, mas talvez alguém também tenha esse problema agora. Agora você pode fazer isso com apenas Javascript e, digamos, PHP. Não é necessário Flash ou Java no lado do cliente.

demo: http://dnduploader.filkor.org/

A idéia é cortar os arquivos com o método Bloque Slim () do Javascript …

Você pode definir o post_max_size apenas para scripts em 1 diretório. Coloque seu script de upload lá e permita apenas esse script para lidar com tamanhos grandes. Ainda é possível que esse script seja atacado com arquivos grandes / inúteis, mas evita configurá-lo globalmente.

Use isso com a APC e você poderá descobrir algo de bom: artigo do IBM Developer works sobre APC

Tentei tudo isso … este é de longe o melhor que já usei …

http://www.uploadify.com/

Dê uma olhada no jumploader.com

Um bom java-applet para fazer o upload.

Eu usei isso para carregar imagens e funciona bem. Não tentei com arquivos maiores do que 10MB, mas eu também deveria trabalhar para arquivos realmente grandes.

Você analisou o uso da APC para verificar o progresso e o tamanho total do arquivo. Aqui está uma boa postagem no blog sobre isso. Isso pode ajudar.

Talvez você possa usar Webdav e Javascript no navegador

AJAX Big upload de arquivos, com progresso, para WebDAV

http://www.webdavsystem.com/ajax/programming/upload_progress

Uma biblioteca simples

http://debris.demon.nl/projects/davclient.js/doc/README.html

Você pode então obter o JS para redirect o usuário para uma página de sucesso. As chaves secretas e o que não podem ser manipulados em um prelúdio de PHP antes de entregar o JS Client-> WebDAV

Eu procuraria FTP, SSH ou SCP, isso permite que você carregue um arquivo grande e ainda tenha controle de access sobre o arquivo também. Isso pode levar um pouco mais para implementar, mas é provavelmente a maneira mais segura de que eu poderia pensar.

Tive sucesso com o upload , e eu recomendaria. É um script jQuery / Flash que lida com grandes carregamentos e você pode passar parâmetros extras para ele (como a chave secreta). Para resolver os problemas do lado do servidor, basta usar o seguinte código. As mudanças ocorrem apenas para o script em que são chamadas:

 //Check to see if the key is there if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key'])) { exit("Invalid request"); } function isValid($key) { //Put your validation code here. } //This line changes the timeout. //Give it a value in seconds (3600 = 1 hour) set_time_limit(3600); //Set these amounts to whatever you need. ini_set("post_max_size","8192M"); ini_set("upload_max_filesize","8192M"); //Generally speaking, the memory_limit should be higher //than your post size. So make sure that's right too. ini_set("memory_limit","8200M"); 

EDITAR Em resposta ao seu comentário:

Dado o que você disse, receio que você não consiga atender aos seus requisitos em http. Todas as soluções lá fora são o código que adiciona resources ao http para o qual nunca foi projetado.

Como você disse, é um protocolo simples. Além de escrever seu próprio software cliente que é executado fora do navegador, um applet java ou usando um protocolo diferente (como o FTP, que foi projetado para isso), você pode não conseguir o que deseja.

Eu fiz o melhor que pude dentro das restrições dadas. Desculpe, eu não poderia fazer melhor.

Eu sei que é uma sugestão para adicionar outra dependência, mas na minha experiência, a maioria dos sites que estão fazendo algo como isso está usando flash no lado do cliente e carregando o arquivo grande como pedaços

adobe como um howto em arquivos flash uploads

Eu também encontrei este tutorial sobre codeproject:

Upload de arquivos múltiplos com barra de progresso usando Flash e ASP.NET

PS – Eu sei que você está usando o PHP e não .net, pensei que a parte importante era o flash;)

Tente isso: http://www.simple2ftp.com usa um applet de FTP baseado em Java dentro de um wrapper inteligente de aplicativos PHP.

Intereting Posts