首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内存不足,尽管memory_limit足够大

内存不足,尽管memory_limit足够大
EN

Stack Overflow用户
提问于 2014-12-15 06:00:23
回答 1查看 532关注 0票数 0

考虑下面这个简单的PHP脚本:

代码语言:javascript
运行
复制
<?php
print memory_get_usage()."<br />";
print ini_get("memory_limit")."<br />";
$file = imagecreatefromjpeg("image.jpg");
?>

输出如下:

代码语言:javascript
运行
复制
109848
120M

Fatal error: Out of memory (allocated 63700992) (tried to allocate 23040 bytes) in /homepages/13/d444038670/htdocs/bilderarchiv/test.php on line 4

我试着读的图片是一张很大的图片。但是,第二行指出memory_limit是120MB,但是脚本在分配了大约64MB时就死了。这怎么可能呢?该脚本在另一个提供商上运行得很好,尽管memory_limit也是120M。

EN

回答 1

Stack Overflow用户

发布于 2014-12-22 05:51:49

内存即将耗尽,但有一个解决方案。

尝试在两台服务器上运行此命令,以确定每个图像像素需要多少内存:

代码语言:javascript
运行
复制
    <?php
    $mem0 = memory_get_usage(true);
    $megapix = imagecreatetruecolor(1000,1000);
    $mem1 = memory_get_usage(true);
    $memdif = $mem1 - $mem0;
    $perpixel = $memdif / (1000 * 1000);
    echo "<pre>1 million pixel memory test
    before imagecreate: $mem0
     after imagecreate: $mem1
     image memory used: $memdif
       bytes per pixel: $perpixel";
    ?>

我得到的结果是:

代码语言:javascript
运行
复制
    1 million pixel memory test  (Linux)
    before imagecreate: 524288
     after imagecreate: 5505024
     image memory used: 4980736
       bytes per pixel: 4.980736

    1 million pixel memory test (Windows)
    before imagecreate: 262144
     after imagecreate: 5505024
     image memory used: 5242880
       bytes per pixel: 5.24288

在每像素5字节的情况下,5760x3240图像将需要89MB。

要查看来自just的imagecreatefromjpeg是否需要超过镜像所需的89MB的临时内存,请在加载镜像后将memory_get_usagememory_get_peak_usage进行比较。在我的测试中,没有显著的。

(我认为旧版本的GD使用了4个字节。)

接下来,找出你实际有多少内存:

代码语言:javascript
运行
复制
    <?php
    echo 'memory_limit ??? ', ini_get('memory_limit'), '<br>';
    $megs = Array();
    for ( $i=0; $i < 1000; ++$i ) {     // try up to 1000MB
        $megs[] = str_repeat('*', 1048000);
        $mb= round(memory_get_usage(true) / 1024/1024);
        echo "$mb "; 
        flush();
        ob_flush();
    }
    ?>

如果您根本没有得到任何输出,则可能存在您无法禁用的缓冲,因此只需在for循环中尝试不同的上限,直到找到仍可用的最大上限。

我很久以前就放弃了缩小大型jpeg图像的GD,转而使用ImageMagick。如果您从PHP中执行它,它是一个单独的进程,因此PHP内存限制不再适用。当然,最终是有内存限制的,但您可以告诉ImageMagick要使用的最大内存。

(我也获得了比GD更高质量的图像。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27474629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档