2014-01-24 2 views
0

часть моего кода является следующее:PHP StrPos и ​​SUBSTR функции вызывает «размер исчерпала разрешено память» ошибку

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

Иногда (не все время!) Появляется ошибка:

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 107663188 bytes) in /path/to/my/script.php on line 88

88-я линия, обозначенная '< =' стрелкой вверху.

Размер $description переменная составляет около 100 kB. Кроме того, я не вижу никаких оснований полагать, что этот код может вызвать накопление памяти без их освобождения.

Вы видите недостатки в моем коде?

+0

'StrPos()' не вызывает каких-либо ошибка, это ваш 'substr()', вызывающий ошибку памяти. Зачем? Поскольку вы создаете 3 строки в памяти (помимо исходного '$ description') ... первый substr() будет выделять столько дополнительной памяти, сколько необходимо для создания первой подстроки; второй substr() будет выделять столько дополнительной памяти, сколько необходимо для создания второй подстроки, тогда конкатенация будет выделять столько дополнительной памяти, сколько потребуется для конкатенированных строк, прежде чем назначать $ description. –

+0

@Mark, функция substr может накапливать выделение памяти самим? –

+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 
} 
+0

использовать обратные ссылки для создания «кода». –

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); 
} 

Похоже, там нет ошибок больше ...