Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde pessoal,
Estou desenvolvendo um sistema onde faremos uploads de arquivos grandes por ele. Estou testando aqui o upload com um arquivo de 4.60 GB. Cronometrados 10 minutos a tela fica branca e ao voltar a sessão foi expirada. Se não clicar em nada em 10 minutos, só clicar posteriormente esse tempo volta para a página de login.
Isso só acontece quando subo os arquivos para o servidor linux com lampp. No windows isso não acontece.
Obrigado pela atenção.
Acho que ele precisa disso: http://php.net/manual/pt_BR/function.session-set-cookie-params.php
Obrigado pela atenção Gabriel e ExtremsX.
O procedimento que consta no link ExtremsX, contém na forma que o Gabriel mostrou acima.
Tentei na forma que o Gabriel sugeriu e não deu certo. Pelo php.ini já havia setado algumas coisas contida ai. Continua da mesma forma.
Será que isso não é alguma configuração no servidor? Porque no windows está ok.
Allex, na tela branca após expirar, não exibe nenhum erro pra ajudar na resolução?
Se não, tente jogar aquele esquema para retornar tudo q há de errado:
ini_set('error_reporting', E_ALL);
ini_set('display_errors','On');
Caso apareça algo, manda pra gente ajudar.
Já tenho isso no código Maykel, e não exibe erro algum. Fica na tela branca, se eu voltar a página já volta pro form de login.
Será que isso não é alguma configuração no servidor? Porque no windows está ok.
Sim, há essa possibilidade. Possuímos um servidor linux, utilizando Debian, e nunca conseguimos alterar o tempo de sessão. Basicamente, é a mesma situação que a sua.
A sessão é compartilhada?
Estou quase instalando o windows server Gabriel rs.
Não entendi ExtremsX, como assim sessão compartilhada?
Você está usando dois servidores para balancear a carga? ou é em só uma?
Em 10min, quando % do arquivo foi enviado?
Testei pelo chrome (para aproveitar a barra de progresso). Vi que o envio total foi em mais ou menos 5 minutos. Depois ficou mais tempo que isso para tentar achar algum caminho. Ai deu o mesmo erro, tela branca e ao voltar a session havia sido expirada.
e quantos % foi enviado nesses 5min?
100%. Só que o arquivo não foi pro servidor.
Como ele sobe 100% do arquivo e não vai pro servidor? :huh:
Qual é o comportamento do script após concluir o upload?
se foi 100%, mas o arquivo não ta no servidor, é por que o servidor não aceita arquivo desse tamanho
Maykel, essa é a ação para upload:
$pasta = 'arquivos' . base64_decode($_GET['pasta']) . '/';
$recebe_arquivo = $_FILES['arquivos'];
if (!empty($recebe_arquivo['name'])) {
$total = count($recebe_arquivo['name']);
for($i = 0; $i < $total; $i++) {
if (file_exists($pasta . $recebe_arquivo['name'][$i]) ) {
echo '<script type="text/javascript">confirm("Arquivo existente, deseja substituir?");</script>';
}
move_uploaded_file($recebe_arquivo['tmp_name'][$i], $pasta . $recebe_arquivo['name'][$i]);
$_SESSION['ultimoClick'] = time(); // 1*
}
}
echo '<script type="text/javascript">location.href="?pasta=' . $_GET['pasta'] . '";</script>';
exit;
ExtremsX, aumentei o limite no servidor, veja:
upload_max_filesize = 102400M
post_max_size = 102400M
1* = Isso aqui é para atualizar o tempo para uma função de deslogar usuário se ficar 10 minutos sem navegar.
Tente um desses:
http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime
http://php.net/manual/en/session.configuration.php#ini.session.cache-expire
http://php.net/manual/en/function.set-time-limit.php
Não sei se você tentou ainda, mas quando você da um var_dump no $_FILES, o que retorna?
Já inseri o var_dump sim, me retorna as informações do arquivo.
O set_time já está com valor 0. max_life está com 24 horas e inseri o cache_expire. Também nada.
As informações do arquivo está OK?
Bom dia,
Para arquivos que dão certo o upload retorna os dados corretamente:
array(1) { ["arquivos"]=> array(5) { ["name"]=> array(1) { [0]=> string(9) "index.php" } ["type"]=> array(1) { [0]=> string(20) "application/download" } ["tmp_name"]=> array(1) { [0]=> string(14) "/tmp/phpzFOHfL" } ["error"]=> array(1) { [0]=> int(0) } ["size"]=> array(1) { [0]=> int(1687) } } }
Só que para os arquivos que dão problema ao ver o código fonte não aparece nada, só uma página em branco. O var_dump é a primeira linha da ação de upload.
Tente isso e veja se vai aparecer algum erro (não dê exit no script nem nada):
<?php
$pasta = 'arquivos' . base64_decode($_GET['pasta']) . '/';
$recebe_arquivo = $_FILES['arquivos'];
if (!empty($recebe_arquivo['name'])) {
$total = count($recebe_arquivo['name']);
for($i = 0; $i < $total; $i++) {
move_uploaded_file($recebe_arquivo['tmp_name'][$i], $pasta . $recebe_arquivo['name'][$i]);
}
}Não retornou erro algum. Ficou só na tela branca igual das outras vezes.
Tente ver se aparecer algo no LOG do Apache ou do PHP (ative antes se não tiver ativado)
Bom... Fiz umas mexidas:
1º - .htaccess
php_value max_input_time 5
php_value max_execution_time 1
php_value upload_max_file_size "102400M"
php_value post_max_size "102400M"
2º - Arquivo de Conexão
ini_set('display_errors',1);
ini_set('display_startup_erros',1);
error_reporting(E_ALL);
ini_set('upload_max_filesize','102400M');
ini_set('post_max_size','102400M');
ini_set('max_input_time',0);
ini_set('max_execution_time', 0);
set_time_limit(0);
session_start();
3º - Função para gerar log:
function logMsg( $msg, $level = 'info', $file = 'main.log' ) {
switch ( $level ) {
case 'info':
$msg = '[INFO] ' . $msg;
break;
case 'warning':
$msg = '[WARNING] ' . $msg;
break;
case 'error':
$msg = '[ERROR] ' . $msg;
break;
}
// data atual
$date = date( 'Y-m-d H:is' );
$msg = '[' . $date . '] ' . $msg;
// adiciona quebra de linha
$msg .= PHP_EOL;
file_put_contents( $file, $msg, FILE_APPEND );
}
4º - Arquivo Upload
if ($action == "inserir") {
$pasta = 'arquivos' . base64_decode($_GET['pasta']) . '/';
$recebe_arquivo = $_FILES['arquivos'];
logMsg('Entrou na página de upload');
logMsg( 'post max size: ' . ini_get( 'post_max_size' ) );
if (!empty($recebe_arquivo['name'])) {
logMsg('Arquivo enviado corretamente para área de transferencia');
$total = count($recebe_arquivo['name']);
for($i = 0; $i < $total; $i++) {
logMsg('Estou no loop para subir o arquivo');
if (file_exists($pasta . $recebe_arquivo['name'][$i]) ) {
echo '<script type="text/javascript">confirm("Arquivo existente, deseja substituir?");</script>';
}
move_uploaded_file($recebe_arquivo['tmp_name'][$i], $pasta . $recebe_arquivo['name'][$i]);
$_SESSION['ultimoClick'] = time();
logMsg('Subi o arquivo');
}
}
echo '<script type="text/javascript">location.href="?pasta=' . $_GET['pasta'] . '";</script>';
exit;
}
E por fim, resultado do log:
>
[2014-11-19 16:5608] [iNFO] Entrou na página de upload
[2014-11-19 16:5608] [iNFO] post max size: 102400M
[2014-11-19 16:5608] [iNFO] Arquivo enviado corretamente para área de transferencia
[2014-11-19 16:5608] [iNFO] Estou no loop para subir o arquivo
[2014-11-19 16:5608] [iNFO] Subi o arquivo
Lembrando que só gera log se o upload for feito com sucesso, não chega a entrar nesta primeira linha do log, mesmo antes de iniciar qualquer ação. Este log foi gerado com um arquivo de 96MB.
E o log do apache e do PHP? apareceu algo?
No log do apache não aparece nada. No do PHP percebi que a session foi destroida:
>
[20-Nov-2014 08:52:39 America/Sao_Paulo] PHP Notice: Undefined index: id_usuario in C:\xampp\htdocs\bloquear.php on line 22[20-Nov-2014 09:03:44 America/Sao_Paulo] PHP Notice: Undefined index: id_usuario in C:\xampp\htdocs\bloquear.php on line 22
A sessão é baseada entre o navegador/cliente e o servidor. Se não houver essa interação, a sessão torna-se ociosa e, portanto, irá expirar conforme o tempo definido.
Procure as configurações no php.ini e aumente o tempo de sessão.
As vezes, sessões compartilhadas podem deletar sessões de outros sistemas, tente o seguinte:
ini_set('session.gc_maxlifetime', 36060); // 3 hoursFonte: http://stackoverflow.com/questions/3476538/php-sessions-timing-out-too-quickly