有没有更好的方法来调整真正大的图像?是否有一种服务提供 API,可以通过我的脚本调整这些大型图像?
有没有更好的方法来调整真正大的图像?是否有一种服务提供 API,可以通过我的脚本调整这些大型图像?
如果你的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.
}
memory_limit
在共享服务器上无法生效,即使phpinfo()
显示你拥有128Mo(例如,1and1将RAM限制为每个进程60Mo)。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模拟内存(有点类似)
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);
我曾经花了一些时间尝试调试直接使用GD的PHP代码,但在大型图像和一些似乎有小错误的子集图像上失败了。
但后来我发现了phpThumb(http://phpthumb.sourceforge.net/),我再也不会回去了。在我的Web目录中添加了两个PHP文件(phpthumb.class.php
和phpthumb.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
太棒了,运行得非常好,速度很快,处理大文件也没有问题。此外,它可以使用GD或ImageMagick,具体取决于服务器上可用的内容,因此相对来说比较便携。
上传它们,然后将调整大小的作业排队,命令行 PHP 脚本可以接着处理(更快且可以有单独的内存限制和执行时间)。
在上传之前让他们把文件大小调整小一点。MAX_FILE_SIZE