简体   繁体   中英

PHP Fatal error: Allowed memory size

Given a large set of unordered images in the format either jpg or png, I wanted to create a PHP script that would firstly filter all folder contents for the allowed formats, copy them to a new folder renamed in numerical order (1.jpg, 2.jpg, 3.jpg ..), create a 50x50 thumbnail of each image in a child folder "thumbs" and then create an .html file called "gallery" which contains a dump of "img" tags of each thumbnail.

It works fine up until a dozen or so images and then exceeds the maximum allocatable memory. This has suddenly happened and appears when the function imagecopyresized is called.

Any advice is appreciated.

Source:

<?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";

?>

Your code looks ok. How large is the 12th image, is it larger than the others? Check out the docs for imagecopyresized () @ php.net, someone wrote a setMemoryForImage() function which determines if the current php.ini setting for 'memory_limit' will allow for a given image to be resized.

This leads me to believe that if the original image is too large, it will exhaust the memory when attempting to resize.

Any advice is appreciated.

Well, at first glance I don't see the leak, but you can use memory_get_usage() to print out debugging info to spot the lie which doesn't release the memory.

Or it can be just one exceptionally big image causing this error alone. For this case yopu have to increase memory limit.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM