将图像文件从另一个域复制到本地的最佳方法是什么? PHP

时间:2014-08-22 13:18:39

标签: php file-get-contents

我需要定期将图像文件(按原样)从我的公共服务器备份到我的本地开发服务器上。

最好的方法是什么? file_get_contentsfile_put_contents的简单组合?还是有其他方法可以做到这一点?

如果它是file_get_contents()方式,那么如何正确/准确地获取图像文件的内容以便通过file_put_contents简单地写入它,因为我不认为简单的文件读取就足够了。 (目前的测试是写空白零字节jpgs)。

问候

3 个答案:

答案 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)

由cron(在远程计算机上)

触发的Shell脚本

该脚本运行rsyncscp命令以通过SSH复制文件。

scp -i ~/.ssh/id_rsa /var/www/html/image.png foo@local-dev-machine:/var/www/html

file_get_contents,就像你说的那样(在本地机器上)

  

如果 fopen包装器已启用,则URL可用作此功能的文件名。有关详细信息,请参阅fopen()[...]

$url = 'http://hostname/images/image.png';
file_put_contents('/var/www/html/image.png', file_get_contents($url));

cURL,使用PHP(在本地计算机上)

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