Pergunta

Como você exclua automaticamente todos os arquivos em um sub -diretório após o X -Time (digamos após 24 horas) - sem usar um comando cronjob no servidor ou pl. Como você pode fazer isso apenas usando o código PHP ou apenas visitando a página sem clicar em algo e o comando automaticamente é executado.

Foi útil?

Solução

Resposta para o último comentário da minha primeira resposta. Vou escrever um exemplo de código, por isso criei outra resposta em vez de adicionar mais um comentário.

Para remover arquivos com extensão personalizada, você deve implementar o código:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filectime($path.'/'.$file)) < 86400) {  // 86400 = 60*60*24
          if (preg_match('/\.txt$/i', $file)) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

Comente: 1. Este exemplo usa expressão regular /\.txt$/i, o que significa que apenas arquivos com extensão txt será removido. '$' significa que o nome do arquivo deve ser encerrado com string '.txt'. A bandeira 'i' indica que a comparação será insensível ao caso. Mais sobre preg_match () função.

Além de você pode usar strripos () função para pesquisar arquivos com certa extensão. Aqui está o snippet de código:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filectime($path.'/'.$file)) < 86400) {  // 86400 = 60*60*24
          if (strripos($file, '.txt') !== false) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

Comente: Este exemplo parece mais óbvio. Resultado de strripos() Também pode ser alcançado com uma combinação de duas funções: strrpos(strtolower($file), '.txt'), mas, IMHO, é uma boa regra usar menos funções em seu código para torná -lo mais legível e menor. Leia alertando atentamente na página da função strripos () (bloco de retorno dos valores).

Mais um aviso importante: Se você estiver usando o sistema UNIX, a remoção de arquivos poderá falhar devido a permissões de arquivo. Você pode verificar o manual sobre chmod () função.

Boa sorte.

Outras dicas

Você pode usar funções principais do php filectime () e desvincular () Para verificar a hora da criação de arquivos e excluir seus arquivos/arquivos.

EDITAR.Exemplo de código:

  if ($handle = opendir('/path/to/files')) {

    while (false !== ($file = readdir($handle))) {
        if (filectime($file)< (time()-86400)) {  // 86400 = 60*60*24
          unlink($file);
        }
    }
  }

Bem, aqui vamos nós, o script PHP que exclui os arquivos que tem x número de dias de idade.

<?
$days = 1;
$dir = dirname ( __FILE__ );

$nofiles = 0;

    if ($handle = opendir($dir)) {
    while (( $file = readdir($handle)) !== false ) {
        if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
            continue;
        }

        if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) {
            $nofiles++;
            unlink($dir.'/'.$file);
        }
    }
    closedir($handle);
    echo "Total files deleted: $nofiles \n";
}
?>

Agora cole este código e salve -o como um arquivo php, faça o upload na pasta de onde deseja excluir os arquivos. Você pode ver no início deste código PHP

$days = 1;

Isso define o número de dias, por exemplo, se você o definir como 2, os arquivos com mais de 2 dias serão excluídos. Basicamente, é isso que acontece quando você executa o script, obtém o diretório atual e lê as entradas do arquivo, pula '. Para o diretório atual e verifica mais se existem outros diretórios,

if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
           continue;
}

Se a entrada do arquivo não for um diretório, ele buscará o tempo modificado de arquivo (tempo de última hora) e se compara, se tiver o número de dias de idade

if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) {
            $nofiles++;
            unlink($dir.'/'.$file);
}

Se a condição se tornar verdadeira, ele excluirá o arquivo com a ajuda da função PHP desvinculada (). Finalmente fecha o diretório e sai. Também adicionei um contador para contar o número de arquivos que estão sendo excluídos, que serão exibidos no final do processo de exclusão. Portanto, coloque o arquivo php no diretório que precisa da exclusão do arquivo e executá -lo.

Espero que isso ajude :)

Aqui está outro exemplo que usa glob e ele excluirá qualquer arquivo

$files = glob('path/to/your/files/*');

foreach($files as $file) { // iterate files
    // if file creation time is more than 5 minutes
    if ((time() - filectime($file)) > 3600) {  // 86400 = 60*60*24
        unlink($file);
    }
}

ou se você quiser excluir certos arquivos

$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT);

Depois de tentar usar esses exemplos, eu bati em alguns problemas:

  1. O operador de comparação deve ser maior do que, não menor que
  2. FilemTime retorna o tempo modificado. Filectime é o momento em que os dados do inode de um arquivo são alterados; Ou seja, quando as permissões, proprietários, grupo ou outros metadados do inode são atualizados, o que pode levar a resultados inesperados

Mudei o exemplo para usar o FileMtime e corrigi a comparação da seguinte forma:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filemtime($path.'/'.$file)) > 86400) {  // 86400 = 60*60*24
          if (preg_match('/\.txt$/i', $file)) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

Eu uso shell at comando, é como um cronjob embora

PHP:

exec("echo rm /somedir/somefile.ext|at now +24 hours");
function deleteCachedData($hours=24)
{
    $files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt');
    foreach($files as $file) {
        if(is_file($file) && (time() - filectime($file)) > $hours*3600) {
            unlink($file);
        }
    }

}

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top