Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用imagecreatefromjpeg同步图像时允许的内存大小已耗尽_Php_Image_Memory Limit - Fatal编程技术网

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

Php 使用imagecreatefromjpeg同步图像时允许的内存大小已耗尽,php,image,memory-limit,Php,Image,Memory Limit,我正在尝试使用imagecreatefromjpeg将图像从一个目录同步到另一个目录,以便在此过程中调整图像的大小。脚本总共必须处理15GB的图像文件。起初脚本运行得很好,直到我遇到内存限制。我发现通过设置以下代码可以解决此问题: ini_set("memory_limit","64M"); 但是在同步了更多的图像之后,同样的问题再次出现,再次出现,直到第五次我将限制设置为1000米,但这并不能解决问题。即使尝试了9999M,它仍然给了我同样的错误: Fatal error: Allowed

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

ini_set("memory_limit","64M");
但是在同步了更多的图像之后,同样的问题再次出现,再次出现,直到第五次我将限制设置为1000米,但这并不能解决问题。即使尝试了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。有人知道这是什么原因吗

有人能给我另一个增加内存限制的选项吗

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

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

你到底叫什么“同步”

newcreateimage($hrdir,$file,$hrdestinationdir,800600)

这条线似乎是你的问题

关于图像大小

  • 文件大小不会影响内存,但会影响图像尺寸
  • 即使压缩大小为64M,也没有图像可以消耗10G的RAM。 这确实是代码中的内存泄漏,而不是特定的图像
  • 将一些调用添加到代码中的
    内存\u get\u usage
    ,然后查看进度

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

    听起来你好像有内存泄漏。您应该一次同步一个映像,确保在继续同步另一个映像之前“清除垃圾”。我上传了用于同步图像的代码。如您所见,我使用“createImage”(这是一个在其构造函数中调整图像大小并重新定位图像的类)将丢失的图像复制到目标目录。这个类中使用的内存应该在完成后被销毁,对吗?同步的意思是:我有一个包含图像的目录,而我有一个空目录。通过同步,我希望所有的图像从一个目录到另一个目录,但具有不同的宽度和高度。至于存储文件。我创建了一个数组,其中包含每个文件的文件名和创建日期,并为两个目录创建了两个单独的数组,以便我可以比较它们以查看文件是否已经存在。在循环遍历一个数组并与另一个数组进行比较时,每当我找到不存在的文件时,我都调用函数“createImage”(因此,当函数返回时,此函数中完成的所有操作都应该被丢弃)。这似乎不是所有操作。为什么您不能直接复制图像?因为用户上载了非常大的图像,我必须在复制之前/复制时调整其大小。您不是在“调用函数”,您正在创建一个对象。每次处理图像时。创建一个对象一次,但调用它的函数来创建图像怎么样?