2015-03-20 1 views
2

J'essaie d'ajouter certaines variables à quelques fichiers qui ont déjà du contenu. J'utilise file_get_contents pour copier le contenu d'un fichier particulier, puis utiliser file_put_contents pour coller des valeurs de variables avec le contenu existant dans ce fichier.Comment effacer la mémoire après file_get_contents s'exécute en php

Le problème est que, sur la première instance, il fonctionne correctement, mais pour le second fichier, il colle tout ce qui a été stocké dans la mémoire. Il met tout le contenu du premier fichier avec le contenu du deuxième fichier.

Y at-il un moyen de vider la mémoire avant l'exécution de la file_get_contents suivante? Ou mon concept est faux ici.

Voici mon code ...

<?php 

if ($_POST["submit"]) { 

    $ip = $_POST['ip']; 
    $subnet = $_POST['subnet']; 
    $gateway = $_POST['gateway']; 
    $hostname = $_POST['hostname']; 
    $domain = $_POST['domain']; 
    $netbios = $_POST['netbios']; 
    $password = $_POST['password']; 


    $ipfile = 'one.txt'; 

    $file = fopen($ipfile, "r"); 
    $ipfileContents = fread($file, filesize($ipfile)); 

    $ipcontent = "ip='$ip'\n"; 
    $ipcontent .= "netmask='$subnet'\n"; 
    $ipcontent .= "gw='$gateway'\n"; 
    $conten = $ipcontent . $ipfileContents; 

    $file = fopen($ipfile, "w"); 
    fwrite($file, $ipfileContents); 

    fclose($file); 

    $ipsh = shell_exec('sh path/to/CHANGE_IP.sh'); 



    $hostfile = 'two.txt'; 

    $fileh = fopen($hostfile, "r"); 
    $hostfileContents = fread($fileh, filesize($hostfile)); 

    $hostcontent = "ip='$ip'\n"; 
    $hostcontent .= "m_name='$hostname'\n"; 
    $hostcontent .= "fqdn='$domain'\n"; 
    $conten = $hostcontent . $hostfileContents; 

    $fileh = fopen($hostfile, "w"); 
    fwrite($fileh, $hostfileContents); 

    fclose($fileh); 

$hostsh = shell_exec('sh path/to/MODIFY_HOSTS.sh'); 


} 








?> 

J'ai essayé unset, mais n'a pas fonctionné

$ipfilecontents->__destruct(); 
unset($ipfilecontents); 

MISE À JOUR:

file_get_contents & file_put_contents a quelques problèmes de concurrence . J'ai donc dû changer ma méthode pour fopen/fwrite/fclose et cela a fonctionné parfaitement. Merci pour votre aide Jacinto.

+1

généralement en utilisant 'unset' –

+0

oui j'ai essayé d'utiliser ipfilecontents $ -> __ destruct(); unset ($ ipfilecontents); mais n'a pas fonctionné @MarkBaker – PeeJay

+0

Vous ne devriez pas avoir à vous en préoccuper. Il y a quelque chose d'autre qui se passe, mais je ne l'attrape pas ... –

Répondre

3
 if ($_POST["submit"]) { 

     $ip = $_POST['ip']; 
     $subnet = $_POST['subnet']; 
     $gateway = $_POST['gateway']; 
     $hostname = $_POST['hostname']; 
     $domain = $_POST['domain']; 
     $netbios = $_POST['netbios']; 
     $password = $_POST['password']; 


     $ipfile = 'one.txt'; 

     $file = fopen($ipfile, "r"); 
     $ipfileContents = fread($file, filesize($ipfile)); 

     $ipcontent = "ip='$ip'\n"; 
     $ipcontent .= "netmask='$subnet'\n"; 
     $ipcontent .= "gw='$gateway'\n"; 
     $content = $ipcontent . $ipfileContents; 

     $file = fopen($ipfile, "w"); 
     fwrite($file, $content); 

     fclose($file); 

     $ipsh = shell_exec('sh path/to/CHANGE_IP.sh'); 

//do the same to the next file 
} 
+1

'Attention: fread(): Le paramètre longueur doit être supérieur à 0 dans /home1/pramir/public_html/development/samba/new/test.php sur la ligne 17' ' Attention: fread(): 4 n'est pas valide flux de ressources dans /home1/pramir/public_html/development/samba/new/test.php sur la ligne 36' – PeeJay

+0

sory, dans le fread, j'ai oublié de changer la variable $ statusLocation. Changez cela pour $ ipfile. Et dans le fwrite ($ file, $ content).trop – Jacinto

+0

Je viens d'éditer ma réponse – Jacinto

2

Ce n'est pas une réponse - je vais le supprimer dans une minute. Il est juste un endroit pratique pour montrer comment faire des déclarations de traces:

$ipfile = 'one.txt'; 
    $ipfileContents = file_get_contents($ipfile); 
    $ipcontent = "ip='$ip'\n"; 
    $ipcontent .= "netmask='$subnet'\n"; 
    $ipcontent .= "gw='$gateway'\n"; 
    echo "DEBUG: hostcontent=<pre>$ipcontent</pre><br />====<br />hostfileContents=<pre>$ipfileContents</pre><br />\n";    
    file_put_contents($ipfile, $ipcontent . $ipfileContents, LOCK_EX); 
    $ipsh = shell_exec('sh path/to/CHANGE_IP.sh'); 

    $hostfile = 'two.txt'; 
    $hostfileContents = file_get_contents($hostfile); 
    $hostcontent = "ip='$ip'\n"; 
    $hostcontent .= "m_name='$hostname'\n"; 
    $hostcontent .= "fqdn='$domain'\n"; 
    echo "DEBUG: hostcontent=<pre>$hostcontent</pre><br />====<br />hostfileContents=<pre>$hostfileContents</pre><br />\n"; 
    file_put_contents($hostfile, $hostcontent . $hostfileContents, LOCK_EX); 
    $hostsh = shell_exec('sh path/to/MODIFY_HOSTS.sh'); 
+0

Merci ... Je vais essayer maintenant ... Vous pouvez certainement le supprimer ... mais je vous demanderais de le conserver pour de futures références. – PeeJay

+0

Vous trouverez peut-être que votre formulaire fournit des valeurs étranges dans $ domain ... Est-ce que le contenu de $ ipcontent est placé avant ou après $ hostcontent? –

+0

Ceci est la sortie .... 'DEBUG: hostcontent = ip = '180.151.2.164' netmask = '255.255.255.0' gw = '192.168.0.1' ==== hostfileContents = DEBUG: hostcontent = ip = '180.151.2.164' m_name = 'bonjour' fqdn = 'fibromixer.com' ==== hostfileContents = ' – PeeJay

0

Le plus efficace serait de lire et d'écrire le fichier en morceaux simultanément:

  • ouvrir le fichier dans en lecture mode d'écriture
  • lire le bloc de données qui seront remplacées par les nouvelles données
  • pointeur de remise à zéro pour commencer de lecture morceau
  • écrire de nouvelles données
  • font la lecture de données les nouvelles données à écrire
  • répétition jusqu'à ce qu'il n'y a pas de données pour écrire

Exemple:

$bufw = "ip=''\n"; 
$bufw .= "netmask=''\n"; 
$bufw .= "gw=''\n"; 

$bufw_len = strlen($bufw); 

$file = fopen($ipfile, 'c+'); 
while ($bufw_len > 0) { 
    // read next chunk 
    $bufr = fread($file, $bufw_len); 
    $bufr_len = strlen($bufr); 

    // reset pointer to begin of chunk 
    fseek($file, -$bufr_len, SEEK_CUR); 

    // write previous chunk 
    fwrite($file, $bufw); 

    // update variables 
    $bufw = $bufr; 
    $bufw_len = strlen($bufw); 
} 
fclose($file); 

Avec cette l'utilisation de la mémoire totale est seulement jusqu'à la longueur des nouvelles données à écrire.

Vous pouvez en faire une fonction comme:

function file_prepend_contents($filename, $data, $flags = 0, $context = null) { 
    if (!is_null($context)) { 
     $handle = fopen($filename, 'c+', ($flags & FILE_USE_INCLUDE_PATH) === FILE_USE_INCLUDE_PATH, $context); 
    } else { 
     $handle = fopen($filename, 'c+', ($flags & FILE_USE_INCLUDE_PATH) === FILE_USE_INCLUDE_PATH); 
    } 

    if (!$handle) return false; 

    if (($flags & LOCK_EX) === LOCK_EX) { 
     flock($handle, LOCK_EX); 
    } 

    $bytes_written = 0; 

    $bufw = $data; 
    $bufw_len = strlen($bufw); 
    while ($bufw_len > 0) { 
     // read next chunk 
     $bufr = fread($handle, $bufw_len); 
     $bufr_len = strlen($bufr); 

     // reset pointer 
     fseek($handle, -$bufr_len, SEEK_CUR); 

     // write current chunk 
     if (ftell($handle) === 0) { 
      $bytes_written = fwrite($handle, $bufw); 
     } else { 
      fwrite($handle, $bufw); 
     } 

     // update variables 
     $bufw = $bufr; 
     $bufw_len = strlen($bufw); 
    } 
    fclose($handle); 

    return $bytes_written; 
}