Qual é a maneira certa de limpar arquivos temporários armazenados no php?
Estou tentando descobrir uma maneira de limpar meu espaço de armazenamento temporário usando php. Eu sei que posso configurar tarefas cron, mas há uma maneira de fazer isso a partir do próprio php?
Eu uso uma pasta de armazenamento temporário para armazenar arquivos PDF gerados para o usuário baixar. Consegui forçar a expiração do arquivo, então ele não estará mais disponível publicamente para acesso após 3 minutos. Agora o problema. Embora o arquivo não esteja acessível publicamente, ele ainda está armazenado em meu servidor. Codifiquei algo assim para limpar o armazenamento.
/** from the main thread */
if (rand(1, 100) <= 5) {
Reports::clean();
}
/** the clean function */
public static function clean()
{
$path = static::getStoragePath(); if($dir_handle = opendir($path)) { while (($fileName = readdir($dir_handle)) !== false) { $file = $path . '/' . $fileName;
if (!is_file($file)) continue; // If file is older that 3 minutes delete it if (time() - filemtime($file) > static::$expires) { unlink($file);
}
}
closedir($dir_handle);
}
}
então isso limpará o armazenamento aleatoriamente. Geralmente isso está bom. mas o problema é quando a limpeza do armazenamento começa a desacelerar essa solicitação como uma tartaruga.
Então pensei em criar um cronjob. Mas existe uma maneira certa de fazer isso a partir do próprio php?
Nota: Estou usando o slim-4, também não tenho muito conhecimento em configurar cronjobs. Portanto, qualquer recurso também será útil
Respostas
Resposta curta: não.
O PHP não tem como disparar automaticamente nenhuma ação.
Crie um script (ou um comando, se for uma estrutura) e acione-o com um cronjob.
Em sua implementação, sempre que a rotina de limpeza atinge o thread principal, dependendo do volume de arquivos em seu diretório PDF, pode criar um atraso significativo na resposta.
Conforme observado nos outros comentários / respostas, um cron job seria de fato a maneira "padrão" de lidar com isso. No entanto, se você não tem acesso a tarefas cron, ou simplesmente prefere uma solução PHP pura, existem algumas abordagens possíveis, além do que você já está fazendo.
Mantenha um registro dos arquivos criados junto com um carimbo de data / hora de criação. Quando a rotina de limpeza é chamada, em vez de fazer uma varredura completa do diretório com verificações de tempo modificadas, exclua com base em seu registro e limpe as entradas excluídas do registro. Armazene seu registro, por exemplo, como um arquivo JSON ou CSV / TSV. Isso deve fornecer uma aceleração significativa nos casos em que há um volume significativo de arquivos, devido à redução no acesso ao sistema de arquivos.
Se você não quiser incomodar seus usuários com o atraso de limpeza, mova a rotina de arquivos voltados para o usuário para arquivos somente de administrador, ou faça uma verificação de usuário administrador e ajuste o gatilho de frequência de limpeza (em OP com 1:20) para coincidir com a frequência de uso do administrador. Isso pode, é claro, reduzir a frequência de limpeza (se os administradores não estiverem por perto), mas aliviará a carga do público.
Finalmente, obviamente, torne-se o Sr. Cron e acione a limpeza manualmente de vez em quando, diariamente ou antes que o servidor fique sem espaço. Em geral, a menos que você tenha muito pouco espaço, não parece ser necessário limpar a cada 20 chamadas de página ou mais. Não tenho ideia do volume de PDFs gerados, do tráfego ocorrido ou dos recursos do servidor, por isso é difícil chegar a valores recomendados sobre a frequência de limpeza.
Este é um conceito ruim, use o agendador cronjob para este trabalho. Aqui está o bash oneliner para excluir todos os arquivos na pasta / tmp / some_path se o conteúdo da pasta exceder 10 MB (modifique de acordo com suas necessidades):
SIZE=$(du -bs --block-size=1M /tmp/some_path | cut -f1); if [[ $SIZE -gt 10 ]];then echo "Folder '/tmp/some_path' has size ($SIZE MB)."; rm -r /tmp/some_path/*; fi
Você pode colar este código em script.sh (incluir shebang, por exemplo, para bash #!/bin/bash
no topo e tornar o arquivo executável, ou seja. chmod +x script.sh
), Em seguida, acrescentar uma nova linha ao agendador de tarefas cron (por exemplo crontab -e
) para verificar o tamanho da pasta a cada hora :
0 * * * * <path_to_the_script>/script.sh
Você pode encontrar mais sobre cronjobs aqui: https://crontab.guru