我已经在我的台式机上安装了Apache和PHP,并运行以下PHP脚本,将一个文件夹中的大图像转换为较小的缩略图,将存储在另一个文件夹中。
"1000. jpg"在一个目录中变成了400像素宽的"1000sm.jpg"在另一个目录
如果我只有20张图片要转换,它会运行并制作缩略图。但是如果我有太多的图像,脚本会提前停止并报告内存问题。
致命错误:在D:Documentsmyserver.comadminmakethumbnails.php中允许的内存大小为134217728字节已耗尽(试图分配29440字节)on line22
内存错误似乎不是基于文件大小而发生的,因为当它停止时,它已经处理了更大的图像。
我添加了"set_time_limit(300);因为一开始它会在30秒后停止,这是不够的。
我可以在这里做一些不同的事情来避免内存问题吗?
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
set_time_limit(300);
$SourcePath = "../img/";
$TargetPath = "../imgsm/";
$TargetWidth = 400;
$dh = opendir($SourcePath);
while (($FileName = readdir($dh)) !== false)
{
if (substr_count($FileName, 'jpg') > 0 )
{
$SourcePathAndFileName = $SourcePath . $FileName;
$TargetPathAndFileName = $TargetPath . str_replace(".jpg", "sm.jpg", $FileName);
list($SourceWidth, $SourceHeight) = getimagesize($SourcePathAndFileName);
$TargetHeight = floor($SourceHeight * $TargetWidth / $SourceWidth);
$thumb = imagecreatetruecolor($TargetWidth, $TargetHeight);
$source = imagecreatefromjpeg($SourcePathAndFileName);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $TargetWidth, $TargetHeight, $SourceWidth, $SourceHeight);
imagejpeg($thumb, $TargetPathAndFileName);
}
}
?>
不需要更新超时时间,但是需要更新内存限制。
在你的情况下,可能你必须在while avec imagejpeg中添加imagedestroy来清理内存。
if (substr_count($FileName, 'jpg') > 0 )
{
$SourcePathAndFileName = $SourcePath . $FileName;
$TargetPathAndFileName = $TargetPath . str_replace(".jpg", "sm.jpg", $FileName);
list($SourceWidth, $SourceHeight) = getimagesize($SourcePathAndFileName);
$TargetHeight = floor($SourceHeight * $TargetWidth / $SourceWidth);
$thumb = imagecreatetruecolor($TargetWidth, $TargetHeight);
$source = imagecreatefromjpeg($SourcePathAndFileName);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $TargetWidth, $TargetHeight, $SourceWidth, $SourceHeight);
imagejpeg($thumb, $TargetPathAndFileName);
imagedestroy($thumb);
imagedestroy($source);
}
https://www.php.net/manual/en/function.imagedestroy.php
PHP ini_set memory limit