【问题标题】:file_put_contents() is very slow when working with lots of images处理大量图像时,file_put_contents() 非常慢
【发布时间】:2015-02-26 13:35:47
【问题描述】:

我必须将大约 5,000 张图像保存到磁盘,而我的脚本运行速度非常慢。其中,我的脚本包含一个foreach 循环,它将图像保存到磁盘。我想问题出在file_put_contents 函数上,因为当我评论它时,一切都很好。

这是我的代码:

file_put_contents($pathimg . '.jpg', file_get_contents($url));
file_put_contents($pathimg . '.jpg', file_get_contents($url3));

有没有办法更快地保存这些图像?

【问题讨论】:

  • 可能你的磁盘运行缓慢
  • 它基于您的系统处理速度我 tihnk..
  • 可能是您的系统执行了过多的 I/O。为您的 php 进程允许更多内存可能有助于将 php.ini 中的 memory_limit 修改为 memory_limit = 512MB。还可以尝试实现睡眠,以防止您的脚本一次写入 5000 张图像
  • 在这里考虑 io 速度 - 图像有多大?即您希望写入磁盘的数据的总大小是多少?源图像和目标图像是否在同一个磁盘上?磁盘最近是否进行过“碎片整理”?我注意到您正在使用“url”来读取图像 - 您读取图像文件的速度有多快(兆字节/秒)?
  • 我的理解是,文件传输速度是受来源限制的,是外部的。谢谢你澄清这一点。除了可能与他们协商更高的下载带宽之外,您对此无能为力。

标签: php image file


【解决方案1】:

您发布的代码在同一行中执行 file_get_contents 和 file_put_contents。您看到的缓慢速度可能是图像下载 (file_get_contents) 或磁盘写入 (file_put_contents) - 但是,写入速度很可能与将图像写入磁盘的速度相比可以忽略不计。

您可能应该分别对它们进行基准测试,以找出导致缓慢行为的原因。

【讨论】:

  • 嘿,谢谢。我发现 file_get_contents 运行太慢了。我用 CURL 替换了它,但仍然没有按预期运行......
【解决方案2】:

您可以使用更快的 CURL。这是您可以使用的功能。

function grab_image($url,$saveto){
    $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);
}

确保在 php.ini 中启用 allow_url_fopen。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多