PHP通过FTP编辑文件

时间:2010-11-04 17:01:07

标签: php ftp

下面是我用来修改一些带占位符字符串的文件的脚本。 .htaccess文件有时会被截断。编辑前大小约为2,712字节,编辑后大小会有所不同,具体取决于域名的长度。当它被截断时,它的大小约为1,400字节。

$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(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 个答案:

答案 0 :(得分:2)

对于主动ftp的被动,我从来没有使用ftp包装器的文件系列函数,通常有这种截断问题。我通常只是使用被动传输恢复到ftp functions,这会使切换变得更加困难,但对我来说工作完美无缺。