php – ftp_get – Предупреждение: ftp_get (): открытие соединения данных в режиме BINARY

Я пытаюсь написать сценарий, который будет загружать файлы с FTP-сервера. Они все довольно большие (около 2 ГБ каждый). Сценарий запускается, но затем, в конце концов, заканчивается вышеуказанной ошибкой. Связано ли это с размером? Есть ли способ обойти это? Вот код:

<?php $ftp_server = "ftp.EXAMPLE.com"; $conn_id = ftp_connect ($ftp_server) or die("Couldn't connect to $ftp_server"); $login_result = ftp_login($conn_id, "USERNAME", "PASSWORD"); if ((!$conn_id) || (!$login_result)) die("FTP Connection Failed"); ftp_sync("download"); ftp_close($conn_id); $mkdir = date('Ym-d'); mkdir('encrypted/'.$mkdir, 0777); smartCopy("./download/", 'encrypted/'.$mkdir); chmodr("encrypted/".$mkdir, 0777); function ftp_sync ($dir) { global $conn_id; if ($dir != ".") { if (ftp_chdir($conn_id, $dir) == false) { echo ("Change Dir Failed: $dir<BR>\r\n"); return; } if (!(is_dir($dir))) mkdir($dir); chdir ($dir); } $contents = ftp_nlist($conn_id, "."); foreach ($contents as $file) { if ($file == '.' || $file == '..') continue; if (@ftp_chdir($conn_id, $file)) { ftp_chdir ($conn_id, ".."); ftp_sync ($file); } else ftp_get($conn_id, $file, $file, FTP_BINARY); } ftp_chdir ($conn_id, ".."); chdir (".."); } function chmodr($path, $filemode) { if (!is_dir($path)) return chmod($path, $filemode); $dh = opendir($path); while (($file = readdir($dh)) !== false) { if($file != '.' && $file != '..') { $fullpath = $path.'/'.$file; if(is_link($fullpath)) return FALSE; elseif(!is_dir($fullpath) && !chmod($fullpath, $filemode)) return FALSE; elseif(!chmodr($fullpath, $filemode)) return FALSE; } } closedir($dh); if(chmod($path, $filemode)) return TRUE; else return FALSE; } function smartCopy($source, $dest, $folderPermission='0777',$filePermission='0777'){ $result=false; if (is_file($source)) { if(is_dir($dest)) { if ($dest[strlen($dest)-1]!='/') $__dest=$dest."/"; $__dest .= basename($source); } else { $__dest=$dest; } $result=copy($source, $__dest); chmod($__dest,$filePermission); } elseif(is_dir($source)) { if(!is_dir($dest)) { @mkdir($dest,$folderPermission); chmod($dest,$folderPermission); } if ($source[strlen($source)-1]!='/') $source=$source."/"; if ($dest[strlen($dest)-1]!='/') $dest=$dest."/"; $return = true; $dirHandle=opendir($source); while($file=readdir($dirHandle)) { if($file!="." && $file!="..") { $result=smartCopy($source.$file, $dest.$file, $folderPermission, $filePermission); } } closedir($dirHandle); } else { $result=false; } return $result; } function deleteDirectory($dir) { if (!file_exists($dir)) return true; if (!is_dir($dir) || is_link($dir)) return unlink($dir); foreach (scandir($dir) as $item) { if ($item == '.' || $item == '..') continue; if (!deleteDirectory($dir . "/" . $item)) { chmod($dir . "/" . $item, 0777); if (!deleteDirectory($dir . "/" . $item)) return false; }; } return rmdir($dir); } ?> 

Вы уверены, что каждый файл двоичный?

Вы можете попытаться угадать тип файла из своего расширения, чтобы настроить режим загрузки, как это предлагается в этом комментарии: http://www.php.net/manual/fr/function.ftp-get.php#86516

У меня была аналогичная проблема, и я использовал следующее решение для меня.

 ftp_pasv($conn_id, TRUE); 

Для тех, кто может прийти по этому вопросу из-за того же вопроса. Для меня это было довольно просто, целевое местоположение для загрузки не имело достаточного свободного места для файла.

Попытайтесь увеличить FTP_TIMEOUT (значение по умолчанию – 90)

 ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 180); 

Он отлично работал для меня.

http://www.php.net/manual/en/function.ftp-set-option.php

Попробуйте использовать ftp_close и ftp_connect для сброса вашего FTP-соединения.

Я провел хороший день на этом, пытаясь найти все, что я смог найти (ftp_pasv, ftp_alloc, переход на FTP_ASCII / FTP_BINARY), без успеха.

На некоторых серверах ограничено количество выгрузок за сеанс.