2011-07-20 18 views
0

私はこのコードを使ってサーバーAからパッケージをダウンロードし、サーバーB(コピー)に入れます。ただし、常に動作しません。転送が完了しないことがあります。とにかくこのコードを改善したり、同じことを行うためにcURLを使うことはできますか?サーバAからサーバBにファイルをダウンロード/コピーする方法は?

これは私のコードです:

// 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(); 
} 

} 

問題は、それが一貫していないということです。それはいつも転送されず、何度も行方不明になり、スクリプトがうまく動かない。

答えて

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

本当にしかし、あなたはそれが失敗している理由を把握する必要があります。 zip操作はそれを殺していますか?実行に時間がかかりすぎたので、PHPスクリプトはタイムアウトしていますか?メモリが不足していますか?もう片方のサーバーがタイムアウトしていますか?何らかのエラー報告とデバッグデータを取得し、それが動作しない理由を理解しようとします。あなたが持っているコードはすばらしく、信頼できるものでなければなりません。

+0

カールはこれまでのところ問題ありません。本当に。 –

1
  1. サーバーのタイムアウト設定を確認しましたか。たぶん、 のコードが実行される前にスクリプトのタイムアウトが発生する可能性があります。
  2. サーバー設定で外部URLを開くことが許可されていることを確認してください。また、このファイルを取得するための適切なアクセス設定もあります。
  3. サーバAのファイアウォールがサーバBを許可し、そのIPをブロックしていないことを確認してください。
  4. curlまたはfile_get_contentsとfile_put_contentsを使用してください。これは動作する可能性が高く、ループを防止します。
  5. 問題がZipArchiveクラスにあるか、ファイル自体を取得しているかどうかを確認してください。
0

あなたが気になる問題を抱えているという事実は、私が遭遇したのと同じ問題を引き起こしている可能性があることを示唆しています。

私は、リモートサーバーから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

関連する問題