我正在使用此代码从服务器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();
}
}
问题在于它不一致。它不会一直传输,很多时候都会丢失,而且脚本运行不好。
答案 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)
答案 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