2010-11-04 4 views
2

Voici un script que j'utilise pour modifier certains fichiers avec des chaînes d'espaces réservés. Le fichier .htaccess est parfois tronqué. Sa taille est d'environ 2 712 octets avant modification et sa taille variera en fonction de la longueur du nom de domaine. Quand il est tronqué, il atteint environ 1400 octets.PHP Modification de fichiers via FTP

$d_parts = explode('.', $vals['domain']); 
$ftpstring = 'ftp://' . $vals['username'] 
     . ':' . $vals['password'] 
     . '@' . $vals['ftp_server'] 
     . '/' . $vals['web_path'] 
; 
$stream_context = stream_context_create(array('ftp' => array('overwrite' => true))); 

$htaccess = file_get_contents($ftpstring . '.htaccess'); 
$htaccess = str_replace(array('{SUB}', '{DOMAIN}', '{TLD}'), $d_parts, $htaccess); 
file_put_contents($ftpstring . '.htaccess', $htaccess, 0, $stream_context); 

$constants = file_get_contents($ftpstring . 'constants.php'); 
$constants = str_replace('{CUST_ID}', $vals['cust_id'], $constants); 
file_put_contents($ftpstring . 'constants.php', $constants, 0, $stream_context); 

Y at-il un bogue dans file_get_contents(), str_replace() ou file_put_contents()? J'ai fait pas mal de recherches et je n'ai trouvé aucun rapport à ce sujet pour d'autres.

Existe-t-il une meilleure méthode pour accomplir cela?

SOLUTION

Sur la base de la réponse de Wrikken, j'ai commencé à utiliser des pointeurs de fichiers avec ftp_f (get | mettre), mais a fini avec zéro fichiers de longueur étant réécrites. Je me suis arrêté à l'aide des pointeurs de fichiers et sont passés à ftp_ (get | mettre), et maintenant tout semble fonctionner:

$search = array('{SUB}', '{DOMAIN}', '{TLD}', '{CUST_ID}'); 
$replace = explode('.', $vals['site_domain']); 
$replace[] = $vals['cust_id']; 
$tmpfname = tempnam(sys_get_temp_dir(), 'config'); 

foreach (array('.htaccess', 'constants.php') as $file_name) { 
    $remote_file = $dest_path . $file_name; 
    if ([email protected]_get($conn_id, $tmpfname, $remote_file, FTP_ASCII, 0)) { 
     echo $php_errormsg; 
    } else { 
     $contents = file_get_contents($tmpfname); 
     $contents = str_replace($search, $replace, $contents); 
     file_put_contents($tmpfname, $contents); 
     if ([email protected]_fput($conn_id, $remote_file, $tmpfname, FTP_ASCII, 0)) { 
      echo $php_errormsg; 
     } 
    } 
} 

unlink($tmpfname); 
+0

À quoi ressemble la version tronquée du fichier? –

+0

@Pekka - Il manque simplement la dernière partie du fichier. J'ai plusieurs lignes de déclarations 'AddType' et la troncature se termine généralement au milieu d'une de ces lignes. – Sonny

Répondre

2

Avec soit passive de ftp actif, je ne l'ai jamais eu dossier beaucoup de chance en utilisant le fichier-famille de fonctions avec les wrappers ftp, généralement avec ce type de problème de troncature. Je reviens tout simplement au ftp functions avec des transferts passifs, ce qui rend le changement plus difficile, mais fonctionne parfaitement pour moi.

+0

Avez-vous un exemple de code pour un type de processus get-> edit-> put? – Sonny

+1

Utiliser un tandem de 'tempnam' pour un fichier temporaire, et' ftp_fget', modifier les données de votre fichier temporaire, et un 'ftp_fput' quand vous avez fini ferait l'affaire. – Wrikken

+0

Je l'essaie maintenant. – Sonny