Eu tenho um site que, toda vez que um usuário efetua login ou efetua logoff, eu o salvo em um arquivo de texto.
Meu código não funciona anexando dados ou criando um arquivo de texto se ele não existir. Aqui está o código de exemplo
$myfile = fopen("logs.txt", "wr") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, $txt);
fclose($myfile);
Parece que não é anexado à próxima linha depois que eu a abrir novamente.
Também acho que também haveria um erro em uma situação quando 2 usuários se conectassem ao mesmo tempo, isso afetaria a abertura do arquivo de texto e o salvamento depois?
logs.txt
e anexar o conteúdo nelaUse o
a
modo Significaappend
.fonte
a
sinalizador criará o arquivo se ele não existir e não importará o que for realmente necessário para oappend
novo texto. Para o\n
ele funciona, mas apenas se dentro de aspas"
aspas não único'
Você pode fazer da maneira OO, apenas uma alternativa e flexível:
Então use-o assim .. digamos que você tenha
user_name
armazenado em uma sessão (semi pseudo código):Verifique seu log com isso:
O resultado é como:
github.com/thielicious/Logger
fonte
fonte
Tente este código:
Eu sempre uso assim, e funciona ...
fonte
(!file_exists($logPath)) ? 'w':'a'
- aa
opção já possui o comportamento correto quando o arquivo não existe. Assim, pode simplificar esta resposta removendo a linha$mode = ...;
e alterando a próxima linha para$logfile = fopen($logPath, 'a');
.Não existe um modo de abertura de arquivo como "wr" no seu código:
Os modos de abertura de arquivo no PHP http://php.net/manual/en/function.fopen.php são os mesmos de C: http://www.cplusplus.com/reference/cstdio/fopen/
Existem os seguintes modos abertos principais "r" para leitura, "w" para gravação e "a" para acrescentar e você não pode combiná-los. Você pode adicionar outros modificadores como "+" para atualização, "b" para binário. O novo padrão C adiciona um novo subespecífico padrão ("x"), suportado pelo PHP, que pode ser anexado a qualquer especificador "w" (para formar "wx", "wbx", "w + x" ou "w + bx "/" wb + x "). Esse sub-especificador força a função a falhar se o arquivo existir, em vez de substituí-lo.
Além disso, no PHP 5.2.6, o modo aberto principal 'c' foi adicionado. Você não pode combinar 'c' com 'a', 'r', 'w'. O 'c' abre o arquivo apenas para gravação. Se o arquivo não existir, ele será criado. Se existir, não será truncado (em oposição a 'w'), nem a chamada para essa função falhará (como é o caso de 'x'). 'c +' Abre o arquivo para leitura e escrita; caso contrário, ele tem o mesmo comportamento que 'c'.
Além disso, e no PHP 7.1.2 foi adicionada a opção 'e' que pode ser combinada com outros modos. Ele definiu o sinalizador close-on-exec no descritor de arquivo aberto. Disponível apenas no PHP compilado nos sistemas conformes POSIX.1-2008.
Portanto, para a tarefa como você a descreveu, o melhor modo de abertura de arquivo seria 'a'. Abre o arquivo apenas para gravação. Coloca o ponteiro do arquivo no final do arquivo. Se o arquivo não existir, ele tentará criá-lo. Nesse modo, fseek () não tem efeito, as gravações são sempre anexadas.
Aqui está o que você precisa, como já foi indicado acima:
fonte
Embora existam muitas maneiras de fazer isso. Mas se você quiser fazer isso de maneira fácil e quiser formatar o texto antes de gravá-lo no arquivo de log. Você pode criar uma função auxiliar para isso.
fonte