Tôi có một tập lệnh tải lên hình ảnh và xoay chúng tùy theo hướng và tôi gặp sự cố khi một hình ảnh có thẻ EXIF được tải lên, tôi nhận được thông báo lỗi:Kích thước bộ nhớ php cho phép đã cạn kiệt trên xoay hình ảnh tải lên
phép kích thước bộ nhớ của 33.554.432 byte kiệt sức (cố gắng phân bổ 10.368 byte.
Và sau đó dòng nó được đề cập đến trong bản ghi lỗi.
tôi đã thông báo rằng nó chỉ xảy ra với những hình ảnh có thẻ EXIF. Nếu hình ảnh bình thường, được tạo ra bởi Photoshop hoặc một cái gì đó được tải lên, nó hoạt động mà không có vấn đề.
Mã định hướng hình ảnh thực tế như sau:
function correctImageOrientation($fullpath) {
if (function_exists('exif_read_data')) {
$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
}
Dòng chính xác trong error_log nơi mà vấn đề bộ nhớ xảy ra thực sự là một trong những nơi nó nói:
$img = imagerotate($img, $deg, 0);
Cách tôi gọi nó trong kịch bản là như sau:
$dirname = session::value('user_id');
$rotatedfile = '/home/myfolder/public_html/'.$dirname.'/'.$file_name;
$rotatedfile = $this->correctImageOrientation($rotatedfile);
Điều tôi cơ bản cố gắng đạt được là hình ảnh xoay được lưu ở cùng một vị trí với tệp gốc, về cơ bản sẽ thay thế nó.
Một lần nữa, điều này chỉ xảy ra với hình ảnh có chứa thông tin EXIF. Tất cả những người khác được tải lên mà không gặp sự cố.
Điều gì có thể gây ra sự cố phân bổ bộ nhớ này?
Chà, đó là SO lạ. Bởi vì tôi thực sự đã có nó được coi là một vấn đề memory_limit và tôi tăng nó lên 256MB trong php.ini nhưng sau khi thấy rằng đoạn mã của bạn đã sửa nó, tôi đã làm một grep trên php.ini một lần nữa (mà tôi đã không làm trước đó) và nhận thấy có 2 bộ nhớ memory_limit khác nhau. Cách ngu ngốc của tôi! Cảm ơn bạn rất nhiều vì đã giúp đỡ bạn trong việc sửa lỗi này :) – user1227914
@ user1227914 Tuyệt vời!Ngoài ra, hãy kiểm tra chỉnh sửa mới nhất của tôi bên dưới mã giải thích lý do tại sao tôi nghĩ RAM của bạn đang bị ăn quá nhiều và trong khi điều chỉnh 'php.ini' có thể không phải là một ý tưởng tuyệt vời cho một trường hợp như thế này. – JakeGould
Điều đó có ý nghĩa và tôi sẽ thực hiện các đề xuất của bạn. Cảm ơn bạn rất nhiều vì đã trả lời rất hữu ích :) – user1227914