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

时间:2011-07-20 15:34:11

标签: php curl

我正在使用此代码从服务器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 个答案:

答案 0 :(得分:2)

$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 :(得分:1)

  1. 您是否检查过服务器上的超时设置。也许他们是 导致脚本在执行代码之前超时 完全。
  2. 确保您可以在服务器设置中通过fopen打开外部网址。并且您还有正确的访问设置来获取此文件。
  3. 确保服务器A的防火墙允许服务器B,而不仅仅是阻止其IP。
  4. 尝试使用curl或file_get_contents和file_put_contents。它也可能起作用并阻止循环。
  5. 检查ZipArchive类是否存在问题或获取文件本身。

答案 2 :(得分:0)

你遇到性情问题表明你可能遇到了我遇到的同样问题 - 这与代码无关。

我使用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