这是情况......我有两台服务器,服务器1和服务器2.服务器1从服务器2下载csv文件,从服务器2删除它,从中读取行并进行一些处理。
在处理时,可以重新创建或更改服务器2上的文件,添加更多行。在完成处理之后,服务器1需要将文件上载回服务器2。
但是,ftp_put()将完全覆盖服务器2上的文件。我真正想要做的是附加到服务器2上的文件而不是覆盖它。有没有办法做到这一点?
为FTP添加卷曲支持:
curl_setopt($ch, CURLOPT_FTPAPPEND, TRUE ); // APPEND FLAG
这可能就是你要找的东西。你熟悉卷曲吗?
另一种选择是使用ftp://
/ ftps://
流,因为PHP 5允许附加。见ftp://; ftps:// Docs。可能更容易访问。
你用file_put_contents
旗试过FILE_APPEND
吗?
如其他答案所示,带有file_put_contents
标志的FILE_APPEND
是将块添加到远程文件末尾的最简单的解决方案:
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);
(添加错误处理)
如果您没有匹配的本地文件,即您正在从内存中上传一大块内容,并且您需要更好地控制写入(传输模式,被动模式等),而不是使用file_put_contents
,请使用ftp_fput
有一个php://temp
(or the php://memory
) stream的句柄:
$conn_id = ftp_connect('hostname');
ftp_login($conn_id, 'username', 'password');
ftp_pasv($conn_id, true);
$h = fopen('php://temp', 'r+');
fwrite($h, $chunk);
rewind($h);
// prevent ftp_fput from seeking local "file" ($h)
ftp_set_option($conn_id, FTP_AUTOSEEK, false);
$remote_path = '/path/to/file';
$size = ftp_size($conn_id, $remote_path);
$r = ftp_fput($conn_id, $remote_path, $h, FTP_BINARY, $size);
fclose($h);
ftp_close($conn_id);
(再次,添加错误处理)