PHP редактирование файлов через FTP - PullRequest
2 голосов
/ 04 ноября 2010

Ниже приведен скрипт, который я использую для изменения некоторых файлов с помощью строк-заполнителей.Файл .htaccess иногда усекается.Перед редактированием его размер составляет около 2712 байт, а после редактирования он будет различаться в зависимости от длины доменного имени.Когда оно усекается, его размер составляет около 1400 байт.

$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()?Я провел немало поисков и не нашел ни одного сообщения об этом для других.

Есть ли лучший способ сделать это?

РЕШЕНИЕ

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

$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 (!@ftp_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 (!@ftp_fput($conn_id, $remote_file, $tmpfname, FTP_ASCII, 0)) {
            echo $php_errormsg;
        }
    }
}

unlink($tmpfname);

1 Ответ

2 голосов
/ 04 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...