Autor Zpráva
maarlin
Profil
Zdravím,
řeším dost palčivý problém - potřebuji parsovat nevalidní HTML a snažím se jít asi nejsnažší cestou - rozhodnul jsem se použít připravený Simple HTML DOM. Pochopil jsem, že funguje na podobném principu, jako SimpleXML - tzn. nahraje celý strom do paměti a pak se v něm hledá. Problém spíše je v tom, že po nahrání a zavolání čistící metody ->clear(), která by tam právě měla být k zabránění toho memory leaku, se prakticky nic nevyčistí a pamět zůstane zanesená.
Nejvíce se to právě začne projevovat a extrémně vadit, když se dotazuje více, než jedna URL v jednom scriptu, protože každá vytvořená instance té třídy za sebou zanechá bordel v paměti.

Abych to shrnul, třída se chová tak, že uvnitř sebe zaregistruje evidentně do paměti nějaká data, která už se neuvolní.
function formatKB($number) {
	return number_format (($number/1024), 2, ',', ' ').' KiB';
}
include ('simple_html_dom.php');

echo 'Before: '.formatKB(memory_get_usage(TRUE)).'<br />';

$html = file_get_html('http://www.google.com/');
$html->clear();

echo 'After: '.formatKB(memory_get_usage(TRUE)).'<br />';

Výstupem (jak můžete sami otestovat) bude před zavoláním file_get_html() 512KiB a po zavolání 1024KiB.
Neřešil jste to někdy někdo? Nevíte jak by se to dalo řešit? Už jsem z toho celkem zoufalý... :(
maarlin
Profil
Kdyby se to někomu hodilo:
Nakonec jsem našel využití v jakési nadstavbě nad DOMDocument - knihovna QueryPath. Knihovnu jsem jemně poupravil, aby dokázala zchroustat i nevalidní dokumenty a nyní je zcela použitelná... :) Už žádné memory leaks...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: