尝试从包含大量图像的 php 构建网页时出现内存不足错误


Out of memory error when trying to build a webpage from php with a lot of images

我遇到了一个有趣的(至少在我看来)问题。

我有一个PHP脚本,应该在运行时生成格式(例如,每个图像的绝对定位值,以便它们以逻辑模式彼此相邻显示)和图像源。完成后,它将从sql db加载适当的图像路径,但目前我对此有问题。
目前我的脚本看起来像这样:

for ($i=0; $i<(866+1+866); $i++){
        for ($j=0; $j<1001; $j++){
            $data .= "<div id='"tac-".$j."'"><img src='"default_tactical.png'"/></div>";
        }
    }

如您所见,它在这一点上是相当基本的,因为我只想测试是否可以将图像放置到位。
此外,$data是我的模板简单地将 -es echo到浏览器的变量。
所有这些的问题是,每当我尝试运行此脚本时,我的服务器都会耗尽内存。

那么问题出在哪里呢?或者更确切地说:如何在不耗尽内存的情况下在网页中拥有大量图像?

尝试将其更改为:

for ($i=0; $i<(866+1+866); $i++){
        for ($j=0; $j<1001; $j++){
            echo "<div id='"tac-".$j."'"><img src='"default_tactical.png'"/></div>";
        }
    }

不应该耗尽内存,因为它不存储任何内容,只是直接输出它。

编辑:由于您无法修改代码,请尝试提高代码中某处的内存限制(可以是循环之前执行的任何PHP代码)。

@ini_set("memory_limit", "512M");

这样看,你有 2 个嵌套循环,并且正在内部构建一个字符串。

866+1+66 = 1733 x 1002 = 17,364,66 iterations
17,364,666 iterations * 40 chars = ~70 megabytes
要么一次

根本不构建字符串,要么至少将其拆分为块,例如

for ($i = ....) {
   for ($j = ....) {
      ... build string here
   }
   echo $string
   $string = ''; // reset to empty string and start over
}

虽然您没有回显您的$data,但您还没有加载图像,它只是一个字符串。它是在PHP处理后加载每个图像的导航器。您的 PHP 在服务器和客户端加载映像中执行。这是您的变量$data内存不足。

尝试如下:

for ($i=0; $i<(866+1+866); $i++){
        for ($j=0; $j<1001; $j++){
            echo "<div id='"tac-".$j."'"><img src='"default_tactical.png'"/></div>";
        }
    }