0

我正在尝试使用 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 是问题所在。有人知道是什么原因造成的吗?

4

1 回答 1

0

谁能给我另一种选择来增加内存限制?

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

您是否正在阅读阵列中的所有图像,而不是一张一张地阅读?

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

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

这条线似乎是你的问题。

关于图片大小,

  1. 没有文件大小会影响内存,但会影响图像尺寸。
  2. 没有图像,即使是 64M 的压缩大小,也能消耗 10G 的 RAM。这确实是您的代码中的内存泄漏,而不是特定的图像。

在代码中添加一些调用memory_get_usage并查看进度。

echo "MEM: ",number_format( memory_get_usage()/(1024*1024) ),"MB used\n";
于 2011-12-01T08:55:44.253 回答