Можете ли вы добавить строки в удаленный файл, используя ftp_put () или что-то подобное?

Вот ситуация … У меня есть два сервера: сервер 1 и сервер 2. Сервер 1 загружает csv-файл с сервера 2, удаляет его с сервера 2, считывает строки из него и выполняет некоторую обработку.

Во время обработки файл на сервере 2 может быть заново создан или изменен, добавив больше строк. После завершения обработки серверу 1 необходимо загрузить файл обратно на сервер 2.

Тем не менее, ftp_put () полностью перезапишет файл на сервере 2. То, что я действительно хочу сделать, это добавить к файлу на сервере 2 и не перезаписывать его. Есть какой-либо способ сделать это?

Поддержка скручивания для FTP:

curl_setopt($ch, CURLOPT_FTPAPPEND, TRUE ); // APPEND FLAG 

Это может быть то, что вы ищете. Вы знакомы с локонами?

Другой вариант – использовать потоки ftp:// / ftps:// , поскольку PHP 5 они позволяют добавлять. См. Ftp: //; ftps: // Документы . Может быть проще получить доступ.

Вы пробовали file_put_contents с флагом FILE_APPEND ?

Как показано в другом ответе, file_put_contents с флагом FILE_APPEND является самым легким решением для добавления фрагмента в конец удаленного файла:

 file_put_contents('ftp://username:pa‌​ssword@hostname/path/to/file', $chunk, FILE_APPEND); 

Если это не сработает, возможно, это связано с тем, что в PHP нет обработчиков URL-адресов .


Хотя, если у вас есть соответствующая локальная копия файла, просто с добавлением нового содержимого, проще использовать «скрытую» функцию ftp_put , FTP_AUTORESUME :

 $conn_id = ftp_connect('hostname'); ftp_login($conn_id, 'username', 'password'); $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 (или php://memory ) :

 $conn_id = ftp_connect('hostname'); ftp_login($conn_id, 'username', 'password'); $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); 

(снова добавьте обработку ошибок)