这是情况......我有两台服务器,服务器1和服务器2。 服务器1从服务器2下载csv文件,从服务器2中删除它,从中读取行并进行一些处理。
在处理时,可以重新创建或更改服务器2上的文件,添加更多行。 完成处理后,服务器1需要将文件上传回服务器2。
然而,ftp_put()将完全覆盖服务器2上的文件。我真正想做的是附加到服务器2上的文件而不是覆盖它。有没有办法做到这一点?
答案 0 :(得分:3)
您是否使用file_put_contents
标志尝试了FILE_APPEND
?
答案 1 :(得分:2)
为FTP添加Curl支持:
curl_setopt($ch, CURLOPT_FTPAPPEND, TRUE ); // APPEND FLAG
这可能就是你要找的东西。你熟悉卷曲吗?
另一个选项是使用ftp://
/ ftps://
个流,因为PHP 5允许附加。见ftp://; ftps:// Docs。可能更容易访问。
答案 2 :(得分:2)
如其他答案所示,带有FILE_APPEND
标志的file_put_contents
是将块添加到远程文件末尾的最简单的解决方案:
file_put_contents('ftp://username:password@hostname/path/to/file', $chunk, FILE_APPEND);
如果它不起作用,可能是因为你没有URL wrappers enabled in PHP。
但是,如果您确实拥有匹配的文件本地副本,只需添加新内容,就可以更轻松地使用ftp_put
的“隐藏”功能FTP_AUTORESUME
:
$conn_id = ftp_connect('hostname');
ftp_login($conn_id, 'username', 'password');
ftp_pasv($conn_id, true);
$remote_path = '/path/to/file';
$local_path = 'file';
ftp_put($conn_id, $remote_path, $local_file, FTP_BINARY, FTP_AUTORESUME);
ftp_close($conn_id);
(添加错误处理)
如果您没有匹配的本地文件,即您正在从内存中上传一大块内容,并且您需要更好地控制写入(传输模式,被动模式等),而不是使用{{ 1}},使用带ftp_fput
的句柄的php://temp
(or the php://memory
) stream:
file_put_contents
(同样,添加错误处理)