Как загрузить / скопировать файл с сервера A на сервер B? - PullRequest
0 голосов
/ 20 июля 2011

Я использую этот код для загрузки пакета с сервера A и помещения его на сервер B (копирование) .. но он не всегда работает, иногда передача не завершается, файл не завершен, и иногда он идет хорошо,Могу ли я в любом случае улучшить этот код или использовать cURL для того же?

Это мой код:

// from server a to server b
$filename = 'http://domain.com/file.zip';
$dest_folder = TEMPPATH.'/';

$out_file = @fopen(basename($filename), 'w');
$in_file = @fopen($filename, 'r');

if ($in_file && $out_file) {

    while ($chunk = @fgets($in_file)) {
    @fputs($out_file, $chunk);
    }
    @fclose($in_file);
    @fclose($out_file);

$zip = new ZipArchive();
$result = $zip->open(basename($filename));
if ($result) {
    $zip->extractTo($dest_folder);
    $zip->close();
}

}

Проблема в том, что он не согласован.Он не передается все время, часто пропадает и скрипт не работает.

Ответы [ 3 ]

2 голосов
/ 20 июля 2011
$filename = 'http://domain.com/file.zip';
echo `wget $filename`;
echo `unzip $filename`;

или

  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  fwrite(fopen($destfile,'w'),$data);

На самом деле, вам нужно выяснить, почему он терпит неудачу. Это убивает операция zip? Тайм-аут php-скрипта истекает из-за слишком долгого выполнения? Не хватает памяти? Тайм-аут сервера на другом конце? Получите некоторые отчеты об ошибках и отладочные данные и попытайтесь выяснить, почему это не работает. Код, который у вас есть, должен быть хорошим и надежным.

1 голос
/ 20 июля 2011
  1. Вы проверили настройки тайм-аута на вашем сервере.Возможно, они приводят к истечению времени ожидания вашего скрипта до полного выполнения кода.
  2. Убедитесь, что вам разрешено открывать внешний URL-адрес с помощью fopen в настройках сервера.И у вас также есть правильные настройки доступа для получения этого файла.
  3. Убедитесь, что брандмауэр Сервера A разрешает Сервер B, а не просто блокирует его ip.
  4. Попробуйте использовать curl или file_get_contents иfile_put_contents.Скорее всего, он тоже работает и предотвращает циклы.
  5. Проверьте, связана ли проблема с классом ZipArchive или с получением самого файла.
0 голосов
/ 20 июня 2013

Тот факт, что у вас проблемы с темпераментом, говорит о том, что у вас может быть та же проблема, с которой я столкнулся, - которая не имеет ничего общего с кодом.

Я вытаскиваю свой zip с удаленного сервера, используя cURL, а затем извлекаю локально сохраненный zip. Иногда это работает, иногда нет ... это вызвало некоторое серьезное перетягивание волос.

Я загружаю свой zip-файл через filezilla, и я обнаружил, что он часто вылетает, повторяется несколько раз и в конце концов работает. Загруженный файл имеет правильный размер и выглядит как успешно загруженный, но если я загружаю его снова, иногда он просто поврежден и не может быть разархивирован.

Пока я проверяю, что мой загруженный zip-файл в порядке, мой скрипт работает нормально ... вот оно:

$zip_url = "http://www.mydomain.com.au/";
$version = "1.0.1.zip"; // zip name

$ch = curl_init();
$tmp_zip = fopen($version, 'w'); // open local file for writing
curl_setopt($ch, CURLOPT_URL, "$zip_url$version"); // pull remote file
curl_setopt($ch, CURLOPT_FILE, $tmp_zip); // save to local file
$data = curl_exec($ch); // do execute
curl_close($ch);
fclose($tmp_zip); // close local file

// extract latest build
$zip = new ZipArchive;
$zip->open($version);
$result = $zip->extractTo("."); // extract to this directory
$zip->close();

if ($result) @unlink($version); // delete local zip if extracted
else echo "failed to unzip";

Одно большое отличие моего кода от предыдущего ответа состоит в том, что я использую CURLOPT_FILE, а не CURLOPT_RETURNTRANSFER. Вы можете прочитать, почему CURLOPT_FILE лучше подходит для крупных переводов, по адресу: www.phpriot.com/articles/download-with-curl-and-php

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