【问题标题】:Laravel Intervention memory leak?Laravel 干预内存泄漏?
【发布时间】:2015-03-28 19:28:49
【问题描述】:

我正在尝试将图像上传到我的本地主机。没问题,如果是小图像(不超过 1 MB)。但是当我尝试上传大约 3MB 的图像时。 php说

致命错误:C:\Users\Tharit\Desktop\Work\Pixelbar\Code\ecompro\vendor\intervention\image\src\Intervention\Image\ 中允许的内存大小为 134217728 字节已用尽(试图分配 18048 字节)第 115 行的 Gd\Decoder.php

不应该这么多。这是代码,在图片上传部分。

        if (Input::hasFile('profile_picture'))
            {
                $old_profile_pic= $user->profile_pic;
                $profile_picture = Input::file('profile_picture');
                $profile_picture_size=getimagesize($profile_picture);
                if($profile_picture_size[0]>$profile_picture_size[1])
                {
                    $mainside = $profile_picture_size[1];
                    $cordx=($profile_picture_size[0]-$profile_picture_size[1])/2;
                    $cordx=(int) $cordx;
                    $cordy=0;
                }
                else
                {
                    $mainside = $profile_picture_size[0];
                    $cordy=($profile_picture_size[1]-$profile_picture_size[0])/2;
                    $cordy=(int) $cordy;
                    $cordx=0;
                }
                $filename  = time() .$user->id . '.' . $profile_picture->getClientOriginalExtension();
                $path = public_path('img/user/' . $filename);
                Image::make($profile_picture->getRealPath())
                            ->crop($mainside,$mainside,$cordx , $cordy)
                            ->resize(100, 100)
                            ->save($path);
                $user->profile_pic = 'img/user/'.$filename;
                if($old_profile_pic != 'img/user/default_profile.gif')
                    {$imagecheck=1;}
            }

【问题讨论】:

  • 我怀疑问题出在您调整图像的大小上。如果这是使用 gd,那么您需要为调整大小前后的图像提供图像高度 x 宽度 x 4 字节的内存
  • @MarkBaker 你的意思是前置+后置?
  • 我的意思是你需要留出足够的内存来同时在 PHP 内存中保存完整大小的图像和缩略图
  • 创建新图像的内存使用量将比上传的图像大小大得多。您上传的图片很可能是压缩格式。当您运行此操作时,它正在创建一个真彩色图像,因此内存使用量将类似于 Height * Width * Channels * (magical constant);因此,您上传的图像一旦解压缩,可能会占用比您预期的更多的内存。本例中的“神奇常数”为 1.7(取自php.net/manual/en/function.imagecreatetruecolor.php#99623);
  • @StephenMtl 这对我来说是新事物。我应该学习更多!谢谢

标签: php laravel laravel-4 memory-leaks


【解决方案1】:

检查你的 php.ini 文件中的这一行

upload_max_filesize=1M

并将其更改为 upload_max_filesize=10M

或将“1M”更改为任何其他所需的文件大小(以 MB 为单位)

【讨论】:

  • 我已将其更改为 5M,但这并没有解决。我认为这是关于现在设置为 128M 的 memory_limit,但我不认为上传 3M 图像需要那么多。是吗?
  • 不,这与 memory_limit 无关。但是如果你之前的upload_max_filesize是1M,那么修改后需要重启服务器才能生效
  • 是的,我之前已经改过了,我觉得这是机器人的问题
【解决方案2】:

您必须在 php ini 中设置许多参数才能使大文件上传成为可能。它们是:

upload_max_filesize
post_max_size
max_input_time
max_execution_time
memory_limit

你应该找到有用的 cmets 在 php ini 文件中设置它们。

另外,它是一个内存错误,所以我认为它与文件上传无关。 memory_limit 应该修复它。尝试将 memory_limit 设置为 -1 以分配无限内存并确定它是否真的是内存问题。

【讨论】:

  • 我知道如果我设置内存限制它会起作用。但是上传3M图片,到128M内存限制php是不是太多了?对不起,但我真的不知道。我有点不明白这些记忆的东西。
  • 而且我认为将内存限制设置为无限不是一个好方法。
  • 你能给出确切的代码行,看看我能不能找出问题所在? C:\Users\Tharit\Desktop\Work\Pixelbar\Code\ecompro\vendor\intervention\image\src\Intervention\Image\Gd\Decoder.php on line 115
  • $canvas = imagecreatetruecolor($width, $height);这是第 115 行的代码,你可以在github.com/Intervention/image/blob/master/src/Intervention/… 上看到整页它是 laravel 包的一部分;干预
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2014-12-09
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多