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

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

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

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

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

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

2 голосов
/ 05 мая 2017

Как показано в другом ответе, 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');
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 (или php://memory) :

$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);

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

2 голосов
/ 29 августа 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...