使用imagecreatefromjpeg同步图像时允许的内存大小耗尽

时间:2011-12-01 08:46:21

标签: php image memory-limit

我正在尝试使用imagecreatefromjpeg将图像从一个目录同步到另一个目录,以调整过程中的图像大小。总的来说,脚本必须处理15 GB的图像文件。起初脚本运行正常,直到我遇到内存限制。我发现通过设置以下代码可以解决这个问题:

ini_set("memory_limit","64M");

但是在更多图像同步之后再次出现同样的问题,并再次出现,直到第五次我将限制设置为1000M,但这不再解决问题了。即使在尝试了9999M之后,它仍然给了我同样的错误:

Fatal error: Allowed memory size of 1778384896 bytes exhausted (tried to allocate 57060 bytes)

我检查了我的phpinfo()并发现它已正确设置:

Directive     Local Value Master Value  
memory_limit  99999M      512M

任何人都可以给我另一个选项来增加内存限制吗?

添加我用于同步的代码:

// SYNCHRONIZE FILES
// GET SOURCE FILES
if ($handle = opendir($hrdir)) {                
    while (false !== ($file = readdir($handle))) {
        if(is_file($hrdir.$file)) {                             
            $nieuwehr_array[$file] = filemtime($hrdir.$file);
        }
    }

    closedir($handle);
}   

// GET EXISTING FILES
if ($handle = opendir($hrdestinationdir)) {             
    while (false !== ($file = readdir($handle))) {
        if(is_file($hrdestinationdir.$file)) {              
            $huidigehr_array[$file] = filemtime($hrdestinationdir.$file);
        }
    }

    closedir($handle);
}           

$hr_added_array = array();
$hr_modified_array = array();

// ADD NEW OR MODIFIED FILES
foreach($nieuwehr_array as $file => $change_date) {
    if(!isset($huidigehr_array[$file]) || $change_date != $huidigehr_array[$file]) {
        new createImage($hrdir, $file, $hrdestinationdir, 800, 600);
        touch($hrdestinationdir.$file,$change_date);
        if(isset($huidigehr_array[$file])) {                
            $hr_modified_array[] = $file;
        } else {                
            $hr_added_array[] = $file;
        }
    }
}

我提前为一些荷兰变量名称做了预测。

编辑1-12-2011 12:00: 刚刚发现问题是62MB的图像文件。它看起来像文件大,然后给55MB是问题。有人知道是什么原因引起的吗?

1 个答案:

答案 0 :(得分:0)

  

任何人都可以给我另一个选项来增加内存限制吗?

为什么不问一下如何编写一个内存消耗更理智的程序?

您是否正在阅读阵列中的所有图像,而不是逐个阅读?

那么,在地球上,你称之为“同步”?

  

new createImage($hrdir, $file, $hrdestinationdir, 800, 600);

这条线似乎是你的问题。

关于图像尺寸,

  1. 没有文件大小影响内存但影响图像尺寸。
  2. 即使64M的压缩大小,也没有图像可以消耗10G的RAM。 它确实是代码中的内存泄漏,而不是特定的映像。
  3. 在代码中添加一些对memory_get_usage的调用并查看进度。

    echo "MEM: ",number_format( memory_get_usage()/(1024*1024) ),"MB used\n";