你的错误是这样的:
Allowed memory size of 33554432 bytes exhausted (tried to allocate
10368 bytes).
33554432字节转换为32兆字节.所以这一切都意味着PHP在尝试做一些工作时内存不足.
你声称失败的图像有EXIF信息,但这并不是我的原因.无论如何,你的问题的快速解决方案是通过向你的函数添加和连接到memory_limit的ini_set行来增加你的函数的PHP内存
例如,在执行if(function_exists(‘exif_read_data’)){check后,在此处添加它.我将其设置为64M,因为在运行此功能时,它将有效地使脚本内存容量加倍.代码在这里:
function correctImageOrientation($fullpath) {
if (function_exists('exif_read_data')) {
ini_set('memory_limit', '64M');
$exif = exif_read_data($fullpath);
if($exif && isset($exif['Orientation'])) {
$orientation = $exif['Orientation'];
if($orientation != 1){
$img = imagecreatefromjpeg($fullpath);
$deg = 0;
switch ($orientation) {
case 3:
$deg = 180;
break;
case 6:
$deg = 270;
break;
case 8:
$deg = 90;
break;
}
if ($deg) {
$img = imagerotate($img, $deg, 0);
}
// then rewrite the rotated image back to the disk as $filename
imagejpeg($img, $fullpath, 100);
} // if there is some rotation necessary
} // if have the exif orientation info
} // if function exists
}
What I am basically trying to achieve is that the rotated image gets
saved in the same place as the original file, basically replacing it.
问题是你在PHP中使用GD库,当PHP将文件加载到系统中时会耗尽内存,并在尝试旋转图像时占用更多内存.
可能有EXIF信息的图像实际上具有比标准72dpi更高的DPI.因此,虽然它们的尺寸可能看起来与没有EXIF信息的另一图像表面相同,但300dpi图像的尺寸实际上比72dpi图像大4倍.这很可能是为什么这些图像失败的原因;不是EXIF信息而是整体DPI.
现在,您还可以通过更改读取为memory_limit = 32M的行来更改php.ini中的内存限制.从技术上讲,这可行.但我不认为这是一个失败的功能脚本的好习惯.
那是因为当您更改php.ini中的设置时,它会增加所有PHP交互的RAM;不只是问题问题.所以你的服务器突然占用了更多用于Apache(运行PHP)的基本功能RAM以及消耗更多RAM的奇怪功能.这意味着如果这个代码每天只被访问几次,那么为什么要为每个PHP进程的32M RAM满意的大服务器负担呢?更好地使用ini_set(‘memory_limit’,’64M’);隔离RAM增加需求就像这样.