鉴于jpg或png格式的大量无序图像,我想创建一个PHP脚本,首先过滤所有允许格式的文件夹内容,将它们复制到按数字顺序重命名的新文件夹(1。 jpg,2.jpg,3.jpg ..),在子文件夹“thumbs”中创建每个图像的50x50缩略图,然后创建一个名为“gallery”的.html文件,其中包含每个缩略图的“img”标记转储
它工作正常,直到十几个图像,然后超过最大可分配内存。这突然发生并在调用函数imagecopyresized时出现。
感谢任何建议。
来源:
<?php
# Prepare vars
$dir = "O:/zip/";
$newDir = "C:/Users/user/Desktop/zip/";
$thumbs = $newDir."thumbs/";
$gallery = $newDir."gallery.html";
$types = array(".jpg", ".png");
$files = array();
$tempFiles = scandir($dir);
$i = 0;
# Copy and rename images
foreach($tempFiles as $file)
{
$thisType = substr($file,-4);
if(in_array($thisType, $types))
{
$dest = fopen($newDir.$i.$thisType, 'w');
fwrite($dest, file_get_contents($dir.$file));
fclose($dest);
list($width, $height) = getimagesize($newDir.$i.$thisType);
$im = imagecreatetruecolor(50, 50);
if($thisType == '.jpg')
{
imagecopyresized($im, imagecreatefromjpeg($newDir.$i.$thisType), 0, 0, 0, 0, 50, 50, $width, $height);
imagejpeg($im, $thumbs.$i.$thisType);
}
else
if($thisType == '.png')
{
imagecopyresized($im, imagecreatefrompng($newDir.$i.$thisType), 0, 0, 0, 0, 50, 50, $width, $height);
imagepng($im, $thumbs.$i.$thisType);
}
imagedestroy($im);
$html .= "<a href='$newDir$i$thisType'><img src='$thumbs$i$thisType' alt='$i$thisType' width='50' height='50'></a>";
print "Successfully processed $i$thisType<br>";
$i++;
}
}
print "Done.<br>";
# Create html gallery for new imgs
$dest = fopen($gallery, 'w');
fwrite($dest, $html);
fclose($dest);
print "There are ".number_format($i)." image files.\n\r";
?>
答案 0 :(得分:3)
您的代码看起来不错。第12幅图像有多大,是否比其他图像大?查看imagecopyresized()@ php.net的文档,有人写了一个setMemoryForImage()
函数,它确定'memory_limit'的当前php.ini设置是否允许调整给定图像的大小。
这让我相信,如果原始图像太大,在尝试调整大小时会耗尽内存。
答案 1 :(得分:1)
感谢任何建议。
嗯,乍一看我没有看到泄漏,但您可以使用memory_get_usage()
打印出调试信息来发现不释放内存的谎言。
或者它可能只是一个特别大的图像导致此错误。对于这种情况,yopu必须增加内存限制。