为我的服务器上的GD库调整太大的图像

时间:2009-08-13 15:43:45

标签: php image-manipulation gd

我几乎总是在网站上为我的客户提供PHP调整大小脚本(使用GD)。无论我多少次告诉他们在上传之前从他们的数码相机调整巨大的7MP图像,他们仍然永远不会这样做。结果是来自服务器的“内存不足”错误,并且图像没有调整大小,因为原始图像的分辨率太大。

有没有更好的方法来调整真正大图像的大小?是否有提供API的服务,我可以通过我的脚本来调整这些大图像的大小?

7 个答案:

答案 0 :(得分:3)

您可以调用Imagemagick来调整php页面中的图片大小,但如果您允许系统调用则会出现安全问题

任何API都会使用大量内存,你也可以更改你的php memory_limit。

答案 1 :(得分:3)

如果您的PHP配置中有可用的ImageMagick API,请使用它! ImageMagick不会在PHP memory_limit中计算,因此可以使用更大的文件。

如果你真的无法控制服务器,那么快速和非常糟糕的解决方法是 - 从$ _POST获取图像文件后,首先检查维度:

<?php
$image_size = getimagesize("yourfile.jpg")
$mem_usage = $image_size[0] * $image_size[1] * 4 //4 bytes per pixel (RGBA)
if ($mem_usage > $mem_aviable) {
    die ('Please upload smaller pic. I tell you that all the time.  '.
         'Resize yout huge 7MP images from your digital camera '.
         'before uploading them.'); //Better put something more polite here.
}

答案 2 :(得分:2)

我因这个问题而被困了几天(和晚上)。

此外,提供商的内存限制因人而异。 并且更改PHP中的memory_limit在共享服务器上不起作用,即使phpinfo()表示您有128Mo(例如,1和1限制RAM到每个进程60Mo),提供程序通常会限制ram。

但我终于在这里找到了一些非常有效的东西:http://www.imagemagick.org/Usage/files/#massive

它需要imagemagick,但我发现大多数提供商本身都在其服务器上提供此功能,甚至是共享服务器。

exec('env MAGICK_TMPDIR=<tmp_dir> nice -5 convert -limit memory 32 -limit map 32 -resize 800x600 huge.jpg reasonable.jpg'); 

正如它所说:

  • env MAGICK_TMPDIR=<tmp_dir>为imagemagick设置临时目录 模拟ram(种类)

  • nice -5也是一个用于更改进程优先级的unix命令 (http://en.wikipedia.org/wiki/Nice_(Unix)

  • convert ...是imagemagick命令行

实际交易大约是-limit memory 32-limit map 32。这是限制二进制文件使用的内存的方式(此处:32Mo)。您可能需要调整值以匹配服务器的值(通常,PHP会告诉您在给出致命错误时分配的最大内存。我建议您将此值除以2或4以使其更加舒适)。

我还需要在我的PHP中添加一些其他行以避免一些附带问题:

ignore_user_abort(true); // ignore user abort : let the script finish resizing even if user aborts
set_time_limit(0); // ignore server timeout
putenv('MAGICK_THREAD_LIMIT=1'); // limit the number of thread for the binary. Very important in my case 

希望所有这一切都有帮助...


要知道服务器上是否有convert可用,您可以尝试使用此功能(在PHP中):

$out = array();
exec('which convert 2>&1', $out);
print_r($out); 

这将为您提供二进制文件的路径(如果存在)。

答案 3 :(得分:1)

您可以使用convert

来支持外部程序

答案 4 :(得分:1)

如何上传然后排队调整大小的作业,命令行php脚本然后可以选择并处理(更快,可以有一个单独的内存限制和执行时间)

答案 5 :(得分:1)

只需让它们在上传之前调整它的大小。 MAX_FILE_SIZE

答案 6 :(得分:0)

我花了一些时间尝试调试直接使用GD的PHP代码,但在大图像和图像子集上失败,这些图像似乎有轻微的错误导致GD窒息。

但后来我找到了phpThumb(http://phpthumb.sourceforge.net/),我永远不会回去。将两个PHP文件添加到我的Web目录(phpthumb.class.phpphpthumb.functions.php)后,我可以使用以下代码生成缩略图:

include("phpthumb.class.php"); 

// Load data into phpThumb object and set parameters
$phpThumb = new phpThumb();
$phpThumb->setSourceData(file_get_contents($_GET['filename']));
$phpThumb->setParameter('w', $width);  // Set width
$phpThumb->setParameter('h', $height); // Set height
$phpThumb->setParameter('zc', 1);      // Specify zoom-crop (instead of stretch)
$phpThumb->setParameter('q', 100);     // Specify quality

// Generate & output thumbnail
$phpThumb->GenerateThumbnail();        // Generate the thumbnail
$phpThumb->OutputThumbnail();          // Output it to browser
$phpThumb->RenderToFile("$thumbname"); // Output it to file
$phpThumb->purgeTempFiles();           // Clean up

Boom,就像魅力一样,速度非常快,对大文件也没有问题。此外,它可以使用GD或ImageMagick,具体取决于服务器上的可用内容,因此它相对便携。