下面是我用来修改一些带占位符字符串的文件的脚本。 .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);
答案 0 :(得分:2)
对于主动ftp的被动,我从来没有使用ftp
包装器的文件系列函数,通常有这种截断问题。我通常只是使用被动传输恢复到ftp functions,这会使切换变得更加困难,但对我来说工作完美无缺。