我使用这个代码从服务器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脚本超时是因为执行时间过长吗?是否内存不足?对端服务器是否超时?获取一些错误报告和调试数据,并尝试找出它不工作的原因。你的代码应该是好的,可靠的。
- 您是否检查了服务器上的超时设置?也许是吧导致脚本在执行代码之前超时完全。
- 确保在服务器设置中允许通过fopen打开外部url。你也有正确的访问设置来获取这个文件。
- 确保服务器A的防火墙允许服务器B,而不仅仅是阻止它的ip。
- 尝试使用curl或file_get_contents和file_put_contents它也可能工作,并防止循环。
- 检查问题是否与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