2010-11-04 2 views
2

Ниже приведен сценарий, который я использую для изменения некоторых файлов с помощью строковых букв. Файл .htaccess иногда усекается. Размер до 2,712 байт до редактирования и будет меняться по размеру после редактирования в зависимости от длины имени домена. Когда он усекается, он заканчивается размером около 1,400 байт.PHP Редактирование файлов по 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); 

Есть ли ошибка в file_get_contents(), str_replace() или file_put_contents()? Я довольно много искал и не нашел никаких сообщений об этом для других.

Есть ли лучший способ достижения этого?

РЕШЕНИЕ

На основании ответа Wrikken, я начал использовать указатели файлов с ftp_f (получить | ставить), но в итоге с нулевой длиной файлов записывается обратно. Я перестал использовать указатели файлов и переключился на ftp_ (получить | ставить), и теперь все, кажется, работает:

$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

Как выглядит усеченная версия файла? –

+0

@Pekka - Это просто отсутствует последняя часть файла. У меня есть несколько строк деклараций AddType и усечение обычно заканчивается в середине одной из этих строк. – Sonny

ответ

2

С либо пассивным активного FTP, я никогда не имел большой файл удачи, используя файл-семью функций с обертками ftp, обычно с такой проблемой усечения. Обычно я возвращаюсь к ftp functions с пассивными переводами, что затрудняет переход, но для меня безупречно работает.

+0

У вас есть пример кода для процесса get-> edit-> put? – Sonny

+1

Использование тандем 'tempnam' для временного файла и' ftp_fget', изменение данных во временном файле и 'ftp_fput', когда вы закончите, сделают трюк. – Wrikken

+0

Я сейчас пытаюсь. – Sonny

Смежные вопросы