PHP strpos和substr函数导致'允许的内存大小耗尽'错误

时间:2014-01-24 12:57:27

标签: php memory-leaks substr strpos

我的代码部分如下:

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字节)

第88行由上面的'&lt; ='箭头表示。

$description变量的大小约为100 kB。此外,我没有理由相信这段代码会导致内存分配累积而不会被释放。

你看到我的代码中有任何缺陷吗?

2 个答案:

答案 0 :(得分:0)

此代码导致内存错误

$description = 'hello<style></style>hello<style>';
while( $pos1 = stripos( $description, '<style' ) ) {
    $pos2 = stripos( $description, '</style>' ) + 8;
    $description = substr( $description, 0, $pos1 ).
        substr( $description, $pos2 );     //   <= This string causing the error
}

答案 1 :(得分:0)

看起来问题是由于如果找不到</stile>这一事实,$description变量将增长到无穷大。 如果表单<script>中使用的<script ... />标记可以显示 现在代码如下:

while( $pos1 = stripos( $description, '<style' ) ) {
  $pos2 = stripos( $description, '</style' ) + 8;
  if( $pos2 < $pos1 ) $pos2 = strpos( $description, '/>' ) + 2;
  if( $pos2 < $pos1 ) break 2;
  $description = substr( $description, 0, $pos1 ).
                 substr( $description, $pos2 );
}

看起来已经没有错误......