Php 可以使用ftp_put()或类似的方法将行附加到远程文件吗?

Php 可以使用ftp_put()或类似的方法将行附加到远程文件吗?,php,ftp,Php,Ftp,情况是这样的。。。我有两台服务器,服务器1和服务器2。 服务器1从服务器2下载csv文件,将其从服务器2上删除,从中读取行并进行一些处理 在处理过程中,可以重新创建或更改服务器2上的文件,并添加更多行。 完成处理后,服务器1需要将文件上载回服务器2 但是,ftp_put()将完全覆盖服务器2上的文件。我真正想做的是附加到服务器2上的文件,而不是覆盖它。有什么方法可以做到这一点吗?您是否尝试过使用file\u APPEND标志添加file\u put\u contents curl_setopt(

情况是这样的。。。我有两台服务器,服务器1和服务器2。 服务器1从服务器2下载csv文件,将其从服务器2上删除,从中读取行并进行一些处理

在处理过程中,可以重新创建或更改服务器2上的文件,并添加更多行。 完成处理后,服务器1需要将文件上载回服务器2


但是,ftp_put()将完全覆盖服务器2上的文件。我真正想做的是附加到服务器2上的文件,而不是覆盖它。有什么方法可以做到这一点吗?

您是否尝试过使用
file\u APPEND
标志添加
file\u put\u contents

curl_setopt($ch, CURLOPT_FTPAPPEND, TRUE ); // APPEND FLAG
这可能就是你要找的。你熟悉卷发吗

另一个选项是使用
ftp://
/
ftps://
流,因为PHP5允许附加。看见可能更容易访问。

如其他答案所示,使用
文件\u APPEND
标志是将区块附加到远程文件末尾的最简单解决方案:

file_put_contents('ftp://username:pa‌​ssword@hostname/path/to/file', $chunk, FILE_APPEND);
如果它不起作用,可能是因为你没有


不过,如果您确实有一个匹配的文件本地副本,只需添加新内容,则使用的“隐藏”功能更容易,即:

(添加错误处理)


如果您没有匹配的本地文件,即您正在从内存上载一块内容,并且您需要比使用
文件放置内容
更好地控制写入(传输模式、被动模式等),请使用带有句柄的:


(同样,添加错误处理)

但是如何包含ftp用户名和密码?@Brian:
ftp://user:password@example.com/pub/file.txt
-只需将其放入路径中,检查我链接的ftp文档://在我的回答中了解详细信息。@hakre哦,好的。我现在明白了。谢谢
file\u put\u contents
似乎比设置所有
curl\u选项要容易得多。使用一个比另一个有什么优点/缺点吗?这就是我回答中“更容易接近”的意思。我更喜欢使用streams,除非您需要curl来实现特定的功能,因为它是一个库。流是PHP的一个很酷的特性。
curl
让我很难过。每当我看到一个有10行
curl\u setopt
的脚本时,我都会在里面死一点。该参数在libcurl中被重命名,可能与PHP相同:CURLOPT\u APPEND一个参数集为1告诉库将其追加到远程文件,而不是覆盖它。这仅在上载到FTP站点时有用。(这个选项在7.16.4之前被称为CURLOPT_FTPAPPEND)——我发现它基本上同时使用curl和ftp://。我想它会起作用的。@BrianGlaz链接断了,你有另一个例子吗?
$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);
$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);