我需要定期将图像文件(按原样)从我的公共服务器备份到我的本地开发服务器上。
最好的方法是什么? file_get_contents
和file_put_contents
的简单组合?还是有其他方法可以做到这一点?
如果它是file_get_contents()
方式,那么如何正确/准确地获取图像文件的内容以便通过file_put_contents简单地写入它,因为我不认为简单的文件读取就足够了。 (目前的测试是写空白零字节jpgs)。
问候
答案 0 :(得分:2)
如您所知
Use file_get_contents() and file_put_contents
$url = 'http://hostname/images/wml.gif';
file_put_contents('/your_path/image.gif', file_get_contents($url));
答案 1 :(得分:1)
您可以采用多种方式(如果我们不限于PHP)
该脚本运行rsync
或scp
命令以通过SSH复制文件。
scp -i ~/.ssh/id_rsa /var/www/html/image.png foo@local-dev-machine:/var/www/html
如果 fopen包装器已启用,则URL可用作此功能的文件名。有关详细信息,请参阅fopen()[...]
$url = 'http://hostname/images/image.png';
file_put_contents('/var/www/html/image.png', file_get_contents($url));
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$raw=curl_exec($ch);
curl_close ($ch);
if(file_exists($saveto)){
unlink($saveto);
}
$fp = fopen($saveto,'x');
fwrite($fp, $raw);
fclose($fp);
答案 2 :(得分:1)
建议不要使用file_get_contents
复制大文件,因为它会将整个文件加载到内存中,如果内存不足,可能会导致崩溃。
更好的解决方案是通过块读取它:
function getUrlFile($url, $path)
{
$newfilename = $path;
$file = fopen($url, "rb");
if ($file) {
$newfile = fopen($newfilename, "wb");
if ($newfile)
while (!feof($file)) {
fwrite($newfile, fread($file, 1024 * 8), 1024 * 8);
}
}
if ($file) {
fclose($file);
}
if ($newfile) {
fclose($newfile);
}
}