【发布时间】:2014-02-15 11:40:42
【问题描述】:
我的代码部分如下:
while( $pos1 = stripos( $description, '<style' ) ) {
$pos2 = stripos( $description, '</style>' ) + 8;
$description = substr( $description, 0, $pos1 ).
substr( $description, $pos2 ); // <= This string causing the error
}
有时(不是一直!)我收到错误:
致命错误:第 88 行 /path/to/my/script.php 中允许的内存大小为 268435456 字节已用尽(尝试分配 107663188 字节)
上面的“
$description 变量的大小约为 100 kB。此外,我没有任何理由相信这段代码会导致内存分配的积累而不被释放。
你发现我的代码有什么缺陷吗?
【问题讨论】:
-
如果您的 $description 大小为 100k,那么您基本上是在创建两个总大小略低于 100k 的子字符串,并且将它们连接起来需要另外 100k 左右......那是 300k,加上$description 的原始 100k 大小....您正在使用近 400k 的内存来执行该行代码
-
如果您正在处理 HTML 标记,请尝试使用 DOM
-
如果找不到
</style>怎么办?$pos2将返回FALSE,它将被转换为0并且您的子字符串不断增长。 -
@Bart - 如果没有找到
<style>,它将不会执行while循环中的代码 -
每次迭代将释放 300k 的内存,一旦完成,您显示的代码中没有先前循环的积累
标签: php memory-leaks substr strpos