2017-07-19 75 views
1

我试图找出足够的数字来调整某些大小的图像时调整ini_set('memory_limit', '*M')。我在测试时不明白的是,有时候我得到Fatal error(显然分配的内存不够),但是如果我刷新脚本几次,它最终设法调整图像大小。为什么PHP内存耗尽错误在图像调整大小上不一致?

为什么调整特定图像的内存要求不一致?为什么最终成功,如果我在浏览器中刷新php脚本(1次或更多次)?就好像PHP部分调整图像的大小,并缓存结果,准备在下次执行时继续执行。

如果我分配一个足够高的值,它始终在第一次执行(明显)上工作。但是,在分配较小的值时,它仍然有效,但值越低,我需要在浏览器中刷新脚本的次数越多,以避免出现错误。

实施例代码

ini_set('memory_limit', '64M'); 

$image = 'image.jpg'; 
$image_size = getimagesize($image); 
$resize_height = round($image_size[1] * 1920/$image_size[0]); 
$image_create = imagecreatefromjpeg($image); 
$image_resized = imagecreatetruecolor(1920, $resize_height); 
imagecopyresampled($image_resized, $image_create, 0, 0, 0, 0, 1920, $resize_height, $image_size[0], $image_size[1]); 
imagejpeg($image_resized, 'image_COPY.jpg', 95); 
imagedestroy($image_create); 
imagedestroy($image_resized); 

例错误

Fatal error: Allowed memory size of 10485760 bytes exhausted (tried to allocate 28672 bytes) in */test.php on line 12 

我可以很容易地通过分配的存储器中的丰富量避免错误,但它是很难找到的阈值,和我很想知道它为什么这样工作。提前感谢任何指针。

+0

这是否发生在128M的默认memory_limit?也许你可以在调整大小之前获得图像大小,并“即时”计算出适当的内存限制? – BenRoob

回答

1

对于在您的服务器上启动的每个进程,如果内存限制高达128MB,并且您的RAM高达1028MB(1GB),则8个进程可以处于并发状态。

这意味着如果您现在认为服务器总是拥有越来越多的内存(例如32GB),则可以假设增加512MB的内存限制是可以接受的。

对于我的应用程序,我将内存限制增加到了1GB,而不会因为我的服务器上令人惊叹的RAM而失去任何并发进程。

此链接对我帮助很大,在过去明白:

php-concurrency

现在对调整图像大小,你可以使用这个计算器您的问题:

Calculator

此链接报价:

This s执行计算器可帮助您设置您的PHP进程的内存大小限制。这是一个非常重要的步骤,当你将要建立一些图像处理网站时,你需要分配足够的内存来处理输入和输出图像。

如要更进一步总是上面的链接:

  • 背景信息
  • TWEAK因子?

    猜猜是什么?设置memory_limit不是一门精确的科学。这就是为什么 我们有“调整因子”,一个基于现实生活经验的乘数。在 练习中,1.5-1.6没问题,在大多数情况下1.8是相当安全的。

    在php.net上有一个脚本根据您自己的图像找到近似的“调整因子” 。该脚本在每个图像上运行单个图像创建功能 ,测量运行时内存使用情况并给出平均值,这是“调整因子”乘数 - 最有可能的是,您也会得到一个介于1.5-1.8之间的数字。但是,您可以添加一些 imagecopy取样代码来模拟整个调整大小过程。 http://php.net/manual/en/function.imagecreatefromjpeg.php#76968

    PHP中的图像处理由GD扩展处理。如果您有 有时间找出我们需要调整因子的原因,请让我知道 。 不幸的是,常见问题并没有给予太多的线索:

    http://www.libgd.org/FAQ_PHP#Why_does_gd_cause_my_PHP_script_to_run_out_of_memory.3F

    每一个形象,有一个“调整因子”估计内存限制,这将是适合没有得到致命错误来调整。

    +0

    这很有趣,但它并没有真正回答关于为什么致命错误对于单个图像不一致的问题。 – suncat100

    +0

    我继续更新我的问题,以正确回答:) – Hooli

    +0

    是的,我看到了:)我可以“计算”内存需求,但它仍然没有回答为什么特定图像的memory_requirement波动或至少充分刷新处理图像的脚本后自行解决。 – suncat100

    相关问题