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);
À quoi ressemble la version tronquée du fichier? –
@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