【问题标题】:consuming memory by script on server通过服务器上的脚本消耗内存
【发布时间】:2011-08-07 20:40:23
【问题描述】:

文件上传后的图像处理导致此错误:

允许的内存大小为 67108864 字节已用尽(试图分配 20624 字节)在 .. 第 61 行

第 61 行是:

$imagem = imagecreatefromjpeg($plik);

服务器内存限制设置为 32MB。

我写了这样的代码:

<?php
$user   = $_POST['user_name'];
   $pass  = $_POST['pass'];
   $file = $_FILES['file']['tmp_name'];


   if ($user == "myuser" && $pass == "mypassword")
   {

    $directory='grafika/small'; 
    $dir=opendir($directory);
    $U = 1;
    while($file_name=readdir($dir))
    {
         if(($file_name!=".")&&($file_name!=".."))
        {
        $U += 1;
        }
    }

    closedir($dir);

    //------------------

    //------   

       list($width, $height) = getimagesize($file);
       $new_height_d = 600;
       $percent_d = $height / 600;
       $new_width_d = $width / $percent_d;
      if ($new_width_d > 1100){
          $percent = $new_width_d / 1100;
          $new_width_d = 1100;
          $new_height_d = $new_height_d/ $percent;

      }


       $percent_m =  $height / 113;
       $new_width_m = $width / $percent_m;

       $image_d = imagecreatetruecolor($new_width_d, $new_height_d);
       $image_m = imagecreatetruecolor($new_width_m, 113);

       $imaged = imagecreatefromjpeg($plik);
       $imagem = imagecreatefromjpeg($plik);

       imagecopyresampled($image_d, $imaged, 0, 0, 0, 0, $new_width_d, $new_height_d, $width, $height);
       imagejpeg($image_d,'grafika/big/'.$U.'.JPG');
       imagecopyresampled($image_m, $imagem, 0, 0, 0, 0, $new_width_m, 113, $width, $height);
       imagejpeg($image_m,'grafika/small/'.$U.'.JPG');
    //--------------------


    //


        $do_zapis =' <img class="mini" src="./grafika/small/'.$U.'.JPG" onClick="wys_big(\''.$U.'\')" alt="zaklin"/>';
        $file = "subpages/min_lista.html";
        $f = fopen($file, "a"); 
        flock($f, 2); 
        fwrite($f, $do_zapis); 
        flock($f, 3); 
        fclose($f);
    //-------------   


       echo('ok');

   }
   else{
       echo('not ok');

   }
   header("Refresh: 2; URL=edycja.php");
?>

当我尝试在服务器上运行它时,上传 *.jpg 文件(小于 1MB)时出现错误(见上文)。

所以我在想有什么办法可以减少消耗的内存或者这很正常吗?

【问题讨论】:

  • 1.哪些代码将在第 61 行附近执行? 2. 内存消耗也取决于图像大小。
  • 有趣的是,在你修复了内存问题之后,当两个文件并行提交时,你会遇到问题,因为它们可能得到相同的编号。请只发布第 61 行和您的代码轮次,以便更容易查看实际触发内存限制的位置。
  • 我建议将flock() 的第二个参数切换为预定义的常量。它们更具描述性。因此,第一个和第二个实例分别是 flock($f, LOCK_EX)flock($f, LOCK_UN)
  • hakre 这不是问题,这个脚本只能由一个人使用,Tarek- 我想它不会解决我的记忆问题:) 但我改变了它。这里是 61' 线(图像的权重始终低于 1,1 MG)>>61 $imagem = imagecreatefromjpeg($plik); >>62 imagecopyresampled($image_d, $imaged, 0, 0, 0, 0, $new_width_d, $new_height_d, $width, $height);
  • 图片$plik有多大(像素大小宽高)?

标签: php file-upload memory-limit


【解决方案1】:

您只是达到了内存限制。增加内存限制(例如 256MB 用于图像处理),问题应该就消失了。

在开始图像处理之前检查您的 PHP.ini 或提高限制:

ini_set("memory_limit", "256m -- 256 megabytes for image manipulation -- m");

【讨论】:

  • 我不会自己回答这个问题并抢走你的风头,但会添加代码:ini_set("memory_limit", "100M");(这应该添加在图像处理类的最顶部)
  • @Kalle H. Väravas:你不能偷我的答案;),但我不想妨碍你回答,所以请随意。
  • 不,你的答案是金。但我的经验表明,memory_limit 帮助不大。如果你有内存耗尽的问题,那么你应该修改你的代码:)
  • @Kalle H. Väravas:这取决于。有时您只需要内存而更改代码无济于事。但是,如果代码写得不好,那么您是完全正确的,那么再多的内存也无济于事;)
  • 字!至少对我来说,统计数据是,在更多情况下,问题出在代码中。例如:获取原始图像 -> 旋转 -> 调整大小 -> 裁剪 -> 生成缩略图等。您实际上可以以更简洁的方式合并所有这些功能。不记得怎么做了,但我没有使用 memory_limit 就解决了我的问题^^
猜你喜欢
  • 2012-04-09
  • 2012-12-28
  • 2016-05-03
  • 2019-10-31
  • 2020-01-30
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2020-01-06
相关资源
最近更新 更多