Попытка загрузить файл 1M локально, и я получаю фатальную ошибку - PullRequest
2 голосов
/ 19 ноября 2008

"Неустранимая ошибка: допустимый объем памяти 31457280 байтов исчерпан (попытка выделить 9828 байтов)".

Это ошибка, которую я получаю, но я только пытаюсь загрузить изображение размером 1 Мб. Я увеличил лимит памяти в php.ini и время выполнения. Я пытаюсь это на локальном сервере MAMP, на Mac, используя Firefox. Это будет для онлайн-галереи изображений. Есть идеи? Ниже приведен код:

    ini_set("memory_limit","30M");
    if(isset($_POST['submit'])){
      if (isset ($_FILES['new_image'])){
          $imagename = $_FILES['new_image']['name'];
          $source = $_FILES['new_image']['tmp_name'];
          $target = "images/".$imagename;
          move_uploaded_file($source, $target);

          $imagepath = $imagename;
          //below here for the removed code


          $save = "thumbs/uploads/" . $imagepath; //This is the new file you saving
          $file = "images/" . $imagepath; //This is the original file
          $imagesize = getimagesize($file);

          list($width, $height) = $imagesize; 

          unset($imagesize);

          if($width>$height)
            {
                $modwidth = 150; 
                $diff = $width / $modwidth;
                $modheight = $height / $diff;
            }else{
                $modheight = 150; 
                $diff = $height / $modheight;
                $modwidth = $width / $diff;
            }
          $tn = imagecreatetruecolor($modwidth, $modheight); 
          $image = imagecreatefromjpeg($file); 
          $imagecopy = imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height); 

          imagedestroy($image);
          imagedestroy($im);
          imagedestroy($imagecopy);
          imagedestroy($source);

          $imagejpg = imagejpeg($tn, $save, 100); 
            imagedestroy($tn);
          imagedestroy($imagejpg);

EDIT

Теперь все решено, надеюсь. Один из моих коллег все время имел решение, но не сказал мне!

Ответы [ 4 ]

4 голосов
/ 19 ноября 2008

Вы, вероятно, загружаете изображение, чтобы сделать некоторые манипуляции с ним. Это приводит к распаковке данных изображения, что требует больших объемов памяти для больших изображений (я думаю, что это около 4 байтов на пиксель).

Вы можете либо не обрабатывать изображение, либо выполнять обработку вне PHP - например, вызывая ImageMagick или какую-либо другую программу. Это немного зависит от того, чего вы пытаетесь достичь.

3 голосов
/ 19 ноября 2008

Это не имеет никакого отношения к размеру (файла) загружаемого изображения, вызов, который нарушает ваш предел памяти, это imagecreatetruecolor ().

imagecreatetruecolor () выделит область памяти для хранения изображения с истинным цветом с без сжатия и будет использовать 32 бита (4 байта) на пиксель.

Так, например, для изображения с разрешением 1024x768 пикселей функция imagecreatetruecolour () будет использовать до 1024 * 768 * 4 = 3145728 байт или около 3 МБ.

Проблема в том, что это значительно увеличивается. Изображение 3072x2034 (6 мегапикселей) по тому же типу вычислений требует около 24 МБ для загрузки в память - я думаю, это тот размер, с которым вы имеете дело.

Решение состоит в том, чтобы передать обработку другому объекту, например imagemagick или NetPBM, который будет выполняться как отдельный процесс и не будет учитываться при ограничении памяти PHP.

NetPBM мой личный фаворит и будет выглядеть примерно так:

anytopnm <file> | pnmscale -xysize <dimensions> | pnmtojpg  > <outfile> 
1 голос
/ 19 ноября 2008

Как уже упоминалось здесь :

не забывайте функцию imagedestroy () или кэширование ваших миниатюр - они сэкономят вам МНОГО работы в будущем.

0 голосов
/ 19 ноября 2008

Перезапускали ли вы apache после увеличения лимита памяти? Если да, то увеличьте немного больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...