Ir para o conteúdo principal
Página inicial
Github

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.