Php 使用imagecreatefromjpeg同步图像时允许的内存大小已耗尽
我正在尝试使用imagecreatefromjpeg将图像从一个目录同步到另一个目录,以便在此过程中调整图像的大小。脚本总共必须处理15GB的图像文件。起初脚本运行得很好,直到我遇到内存限制。我发现通过设置以下代码可以解决此问题:Php 使用imagecreatefromjpeg同步图像时允许的内存大小已耗尽,php,image,memory-limit,Php,Image,Memory Limit,我正在尝试使用imagecreatefromjpeg将图像从一个目录同步到另一个目录,以便在此过程中调整图像的大小。脚本总共必须处理15GB的图像文件。起初脚本运行得很好,直到我遇到内存限制。我发现通过设置以下代码可以解决此问题: ini_set("memory_limit","64M"); 但是在同步了更多的图像之后,同样的问题再次出现,再次出现,直到第五次我将限制设置为1000米,但这并不能解决问题。即使尝试了9999M,它仍然给了我同样的错误: Fatal error: Allowed
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”(因此,当函数返回时,此函数中完成的所有操作都应该被丢弃)。这似乎不是所有操作。为什么您不能直接复制图像?因为用户上载了非常大的图像,我必须在复制之前/复制时调整其大小。您不是在“调用函数”,您正在创建一个对象。每次处理图像时。创建一个对象一次,但调用它的函数来创建图像怎么样?