我遇到了一个有趣的(至少在我看来)问题。
我有一个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>";
}
}