Utilitários de armazenamento
O Storage é um utilitário com vários métodos para gerenciar arquivos no armazenamento do aplicativo.
Obtendo o caminho a partir do armazenamento
É possivel usar a constante $file = INPHINIT_SYSTEM . '/storage/myfile.txt';, mas para facilitar o método Storage::path($path) permite obter o caminho, ao mesmo tempo que evita acidentes com .., exemplo:
use Inphinit\Experimental\Utility\Storage;
// Output: /foo/bar/baz/my-app/system/storage/myfile.txt
echo Storage::path('myfile.txt');
// Output: /foo/bar/baz/my-app/system/storage/foo/bar/baz/file.data
echo Storage::path('foo/bar/baz/file.data');
Se um valor for passado contendo .., um exceção será lançada, evitando problemas, como no exemplo:
echo Storage::path('../file.data');
Output:
Fatal error: Uncaught Error: Class "Storage" not found in /home/websites/myapp/system/dev.php:68
Stack trace:
#0 /home/websites/myapp/system/vendor\inphinit\framework\src\Inphinit\App.php(218): {closure:/home/websites/myapp/system/dev.php:66}()
#1 /home/websites/myapp/index.php(10): Inphinit\App->exec()
#2 {main}
thrown in /home/websites/myapp/system/dev.php on line 68
O uso desse método é ideal para valores dinamicos, então é possivel tratar o erro:
$input = get_user_path();
try {
$absolute_path = Storage::path($input);
} catch (\Exception $ex) {
echo 'Failed: ', $ex->getMessage();
exit;
}
Criando diretório no armazenamento
Apesar do uso da função nativa mkdir() ser na prática bastante simples, o uso de um atalho para trabalhar com o armazenamento da aplicação. Exemplos de uso:
use Inphinit\Experimental\Utility\Storage;
// Criará uma pasta recursivamente com a mesma permissão da pasta system/storage
Storage::mkdir('foo/bar/baz');
Para dados de aplicação que não são armazenados, alterar permissões não é o ideal, mas existem exceções, portanto, pode-se utilizar o seguinte:
use Inphinit\Experimental\Utility\Storage;
// Criará uma pasta recursivamente cujo todas terão a mesma permissão:
Storage::mkdir('foo/bar/baz', 0755);
Alterando o tempo de Atualização e de Acesso
A função nativa touch($filename, $mtime, $atime), se $mtime ou $atime recebem null como valor, o arquivo terá o tempo
de Atualização e o tempo de Acesso alterados para a tempo atual do sistema (igual ou proxímo time()), e isso pode ser um
inconveniente a necessidade for alterar apenas um dos valores, o que leva a usos como:
// change only access time
touch($file, filemtime($file), $new_access);
// change only modified time
touch($file, $new_modified, fileatime($file));
Para facilitar esse uso no armazamento e também permitir incluir o uso de DateTime para uma melhor legibilidade durante o desenvolvimento,
também permitindo um melhor controle sobre a timeZone, é possivel usar:
use Inphinit\Experimental\Utility\Storage;
// Altera somente o tempo de touch
Storage::modified($file, new DateTime('2008-11-25'));
Alterando somente o tempo de Acesso do arquiv:
use Inphinit\Experimental\Utility\Storage;
// Altera somente tempo de Acesso
Storage::access($file, new DateTime('2014-10-12'));
Ainda é possivel usar Unix timestamp:
// Altera o tempo de Acesso para aproximadamente uma hora atrás
Storage::access($file, time() - 3600);
// Altera o tempo de Modificação para aproximadamente duas horas atrás
Storage::modified($file, time() - 7200);
Usando DateTimeImmutable
Por uma questão de retrocompatibilidade, apenas os valores DateTime e int são aceitos,
mas ainda é possivel usar DateTimeImmutable, usando o método getTimestamp(), como no exemplo:
$tz = new DateTimeZone('Pacific/Nauru');
$dt = new DateTimeImmutable('now', $tz);
Storage::access($file, $dt->getTimestamp());
Limpando arquivos antigos
Para limpar arquivos antigos, baseado em uma data limite, é possivel usar o seguinte método:
use Inphinit\Experimental\Utility\Storage;
// Remove arquivos dentro de system/storage/foo/bar/baz/ que tenham mais de uma hora
Storage::clear('foo/bar/baz', 3600);
Note que por padrão o método só irá apagar (tentar) 100 arquivos por vez, para evitar consumir muito tempo acidentalmente, mas isso pode ser ajustado:
use Inphinit\Experimental\Utility\Storage;
// Remove até 500 arquivos dentro de system/storage/foo/bar/baz/ que tenham mais de uma hora
Storage::clear('foo/bar/baz', 3600, 500);
Também é possivel filterar os tipos de arquivos pelos nomes, como no exemplo:
use Inphinit\Experimental\Utility\Storage;
Storage::clear('foo/bar/baz', 3600, 100, function ($name) {
// Irá apagar somente cujo o nome comece com ~myprefix_
return strpos($name, '~myprefix_') === 0;
});
Se a função no quarto parametro retornar true, o arquivo será elegido para remoção, qualquer valor diferente de true
irá ignorar o arquivo.