如何从服务器A下载/复制文件到服务器B



我使用这个代码从服务器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();
}
}

问题是它不一致。它不是每次都被传输,很多时候它丢失了,脚本不能很好地运行。

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

说真的,你需要弄清楚为什么它会失败。邮编行动扼杀了它吗?php脚本超时是因为执行时间过长吗?是否内存不足?对端服务器是否超时?获取一些错误报告和调试数据,并尝试找出它不工作的原因。你的代码应该是好的,可靠的。

  1. 您是否检查了服务器上的超时设置?也许是吧导致脚本在执行代码之前超时完全。
  2. 确保在服务器设置中允许通过fopen打开外部url。你也有正确的访问设置来获取这个文件。
  3. 确保服务器A的防火墙允许服务器B,而不仅仅是阻止它的ip。
  4. 尝试使用curl或file_get_contents和file_put_contents它也可能工作,并防止循环。
  5. 检查问题是否与ZipArchive类或获取文件本身有关。

你有气质问题的事实表明,你可能有同样的问题,我遇到-这与代码无关。

我正在使用cURL从远程服务器拉我的zip,然后提取本地保存的zip。有时有效,有时无效……这引起了一些严重的不安。

我通过filezilla上传我的zip,我发现它经常崩溃,重试几次,最终工作。上传的文件有正确的文件大小,看起来像成功上传,但如果我再次下载它,有时它只是损坏,无法解压缩。

只要我确保我上传的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

最新更新