Skip to content

PHP: Adicionar Linha em arquivos de texto com php (6166 arquivos)

Há 2 semanas estive em um “calça justa” , pois estava necessitando colocar o rodapé de uma empresa (link) , para que, ao ser acessada uma documentação de 6166 páginas o link da empresa fosse exibido no rodapé. Consegui solucionar o caso, mas ralei pra caramba (2 dias), visto que não é minha praia usar funções para edição de arquivos. Mas segue a dica.
Terreno
Estava em uma plataforma linux, aonde pude fazer os testes.
Os arquivos para serem editas, tinham extensão .HTML (documentação online)
Partindo pra CIMA
1-> esteja certo de que é o root da máquina.
2-> espero que esteja no diretório aonde todos os arquivos estão (6166, para ser mais preciso)
3-> use o comando:
ls >> ver.txt
A saída acima lista os arquivos e os coloca em cadeia ajustada dentro do arquivo ver.txt, a saída ficaria (listando conteúdo de ver.txt) mais ou menos assim:
arquivo1.html
arquivo2.html
assim sucessivamente…
Feito isso, devemos assegurar que TODOS os arquivos tem permissão de escrita total, principalmente quando estamos tratando de um servidor local, o qual, se o php não for em CGI estará utilizando a permissão nobody (default do apache como módulo).
Vamos para o arquivo PHP que fará a edição dos 6166 arquivos, colocando um link no rodapé de todos.
Arquivo da Benção
<?
$conteudo = ‘<a href=”http://www.linkdorodape.com.br”>Hospedado por EMPRESA X</a>’;
$contador = 6166;
$i = 0;
$linha = file(‘ver.txt’);
while( $i <= $contador )
{
if(file_exists($linha[$i]))
{
echo “existe”;
}
else
{
echo “nao existe”;
}if(is_writable($linha[$i]))
{
echo ‘ permite escrita’;
echo ‘</br>’;
}
echo “$linha[$i]”;
//file_put_contents($linha[$i], $conteudo, FILE_APPEND);
$linha[$i] = trim($linha[$i]);
$abrir = fopen($linha[$i], ‘a+’);
if(!$abrir)
{
echo “o arquivo $linha[$i] nao abre”;
exit();
}
$writer = fwrite($abrir, $conteudo);
fclose($abrir);
$i++;
}

?>

Salve este arquivo como replacer.php

Basta executar que ele vai editar TODOS os arquivos que estão listados em ver.txt e que estão na mesma pasta que ELE.

Explicando o Script

Vou comentar cada linha para que vocês entendam minha “coisa prima”.

linha 1: <?

Essa é a tag de abertura do PHP.

linha 2: $conteudo = ‘<a href=”http://www.linkdorodape.com.br”>Hospedado por EMPRESA X</a>’;

Esta variável de Strings contém a informação exata de nosso rodapé, que na realidade é um link de uma empresa, mas pode ser qualquer texto ou tag que desejar.

linha 3: $contador = 6166;

Esta variável contém o número de arquivos total para que delimite um loop mais a frente.

linha 4: $i = 0;

Esta variável define o valor inicial para o loop.

linha 5: $linha = file(‘ver.txt’);

Esta linha é interessante. Diferente de algumas funções para abertura de arquivos, o File abre um arquivo e converte cada linha dele em um array, podendo ser acessado o valor como no exemplo a seguir: echo “$linha[0]”; que nos mostraria o primeiro valor da lista.

linha 6: while( $i <= $contador )

Como todos sabem, é o loop que tem o valor de “enquanto $i for menor que o $contador, continue fazendo”.

linha 7: {

Abre o corpo do loop while.

linha 8: if(file_exists($linha[$i]))

A função File_Exists verifica se aquela string com o nome de arquivos é real, ou seja, se o nome do arquivo passado REALMENTE nos leva a um arquivo real (realmente existe). Neste código, perceba que passei o valor $linha[$i] pois linha contém 6166 nomes de arquivos, mas o valor dachave de array $i nos leva ao valor inicial de $i, que é 0 (o que nos faz acessar o primeiro valor da lista, ou seja, o primeiro arquivo) e mais a frente recebe o operador de incremento para acrescentar 1 a variável i. o IF vale como: “Se o string de arquivo for realmente UM ARQUIVO, faça…”

linha 9: {

Este aí é o corpo do IF de verificação de existência do arquivo.

linha 10: echo “existe”;

Se o arquivo existir, exibir EXISTE.

linha 11: }

Fecha o corpo da condição real que exibe “existe”.

linha 12: else

Se não existir o arquivo, faça…

linha 13: {

Corpo de else.

linha 14: echo “nao existe”;

Exibir “não exite”;

linha 15: }

Fecha o corpo do “Não haver arquivo” em ELSE.

linha 16: em branco

linha 17: if(is_writable($linha[$i]))

Isso vale como “se o arquivo permitir escrita, o arquivo que você está me passando através de $linha[$i], eu farei algo…”.

linha 18: {

Abre o corpo do IF acima.

linha 19 e 20:  echo ‘ permite escrita’;
echo ‘</br>’;

Exibem as mensagens dentro das aspas simples.

linha 21: }

Fecha o corpo do if.

linha 22: echo “$linha[$i]”;

Exibe o nome do arquivo.

linha 23: //file_put_contents($linha[$i], $conteudo, FILE_APPEND);

Tem a mesma equivalência de abrir, colocar o conteúdo no fim e BOA!    ?:)

linha 24: $linha[$i] = trim($linha[$i]);

Esta linha é o trunfo, ela arranca os espaços (caso tenham) “acoplados” em seus arquivos (nos nomes deles) citados dentro de ver.txt. A função trim é que faz esta maravilha.

linha 25: $abrir = fopen($linha[$i], ‘a+’);

Esta variável contém a função que abre o arquivo e coloca o ponteiro no final.

linha 26: if(!$abrir)

Se der problema na função de abrir o arquivo (observe o caractere “!”) faça algo.

linhas do if:  {
echo “o arquivo $linha[$i] nao abre”;
exit();
}

Exiba que o arquivo não abra e PARE!

linhas finais: $writer = fwrite($abrir, $conteudo);

Abre o arquivo ($abrir) e ESCREVE o conteúdo de $conteudo dentro dele.

Final: fclose($abrir);
$i++;
}

?>

Fecha o arquivo que foi escrito,  acrescenta 1 ao valor de $i (que era zero), para que, ao prosseguir o loop vá editando os arquivos representados pelo array $linhas[$i]  que por sua vez NUNCA terão o mesmo valor pois $i sempre recebe 1 a cada inserção de RODAPÉ, até que chegue no valor 6166 do $contador. Por fim a tag de finalização do PHP.

Espero que seja útil para vocês.

2 Comments

  1. Cara, comigo aqui dá erro…

    pode me explicar pq gera:

    Notice: Undefined offset: 2 in C:\Arquivos de programas\EasyPHP 2.0b1\www\ADS_admin\engine.php on line 15

    Obrigado

  2. Opa, eu dei uma consultada no seu script amigo. E concertei ele colocando sizeof(nome da var) -1. Dai o ponteiro nunca será maior ou igual que o contador. Sou iniciante em php, me corrijam se eu estiver errado.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.