簡體   English   中英

試圖在本地上傳1M文件,我收到致命錯誤

[英]Trying to upload a 1M file locally and i get a Fatal Error

“致命錯誤:允許的內存大小為31457280字節耗盡(嘗試分配9828字節)”。

這是我得到的錯誤,但我只是嘗試上傳1mb圖像。 我增加了php.ini中的內存限制和執行時間。 我在使用firefox的Mac上的本地MAMP服務器上嘗試此操作。 這將是一個在線圖片庫。 有任何想法嗎? 以下是代碼:

    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);

編輯

現在已經有希望了解這一點。 我的一位同事一直都有解決方案,卻忽略了告訴我!

您可能正在加載圖像以對其進行一些操作。 這導致圖像數據被解壓縮,這需要大量的內存用於大圖像(我認為每個像素大約4個字節)。

您可以選擇不處理圖像,也不選擇在PHP之外進行處理 - 例如通過調用ImageMagick或其他程序。 這取決於你想要完成的事情。

它與您上傳的圖像的(文件)大小無關,打破內存限制的調用是imagecreatetruecolor()。

imagecreatetruecolor()將分配一個內存區域,以便在沒有壓縮的情況下存儲真彩色圖像,並且每個像素使用32位(4個字節)。

因此,對於1024x768像素的圖像,例如,imagecreatetruecolour()將耗盡1024 * 768 * 4 = 3145728字節,或大約3MB。

問題是,這種情況非常顯着。 一個3072x2034(600萬像素)的圖像,通過相同的計算,需要大約24MB才能加載到內存中 - 我猜這是你正在處理的那種大小。

解決方案是將處理交給像imagemagick或NetPBM這樣的其他東西,它將作為一個單獨的進程運行,而不是計入PHP內存限制。

NetPBM是我個人的最愛,看起來像是:

anytopnm <file> | pnmscale -xysize <dimensions> | pnmtojpg  > <outfile> 

如前所述這里

不要忘記imagedestroy ()函數,或緩存你的縮略圖 - 它們將為你節省大量的工作。

在增加內存限制后重啟apache了嗎? 如果是,那么再增加一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM