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

问题描述 投票:0回答:3

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

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

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

问候

php file-get-contents
3个回答
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
投票

您可以通过多种方式执行此操作(如果我们不限制自己使用PHP)

Shell script triggered by a cron (on remote machine)

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

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

file_get_contents, like you've said (on local machine)

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

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

cURL, with PHP (on local machine)

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

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);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.