Ztráta obsahu bloku s velikostí nad 256kB

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Myiyk
Člen | 321
+
+1
-

Ahoj,
mám šablonu s výpisem položek. Těch položek je 494. Když si omezím výpis na 300, tak to funguje. V moment kdy změním omezení na 500. Tak se obsah celého bloku ztratí.
Jedná se o blok content, tudíž zůstane jen šablona stránky a obsah tam není žádný.

Zkoušel jsem mazat cache. Nedostávám žádnou chybu.
Využití RAM je 17.91MB, limit je 128MB.

Pomocí kódu {dump ob_get_length()} jsem zjistil že blok má délku 263224 znaků.

Tak mě napadlo, že tam je někde nějaký limit, že se nevypisují bloky nad 256k znaků. Ten limit bude nejspíš zakopaný někde v output buffer PHP.

Napadá mě možnost udělat stránkování. Šlo by ale vypsat všechny položky najednou?

Web jede na webhostingu od wedos. PHP 5.6 Nette 2.3.4.

Myiyk
Člen | 321
+
0
-

Našel jsem přesnou hranici kdy to funguje a kdy ne.

celý kód je na jednom řádku

{block content}{for $i=1;$i<$_GET['limit'];$i+=2}a {/for}{/block}

198 863 funguje
198 864 nefunguje

Tím jsem si potvrdil, že to nefunguje, protože blok obsahuje příliš mnoho znaků.

Prosím o radu, co v konfiguraci přenastavit, abych ten limit zvýšil alespoň 10×

Editoval Myiyk (22. 8. 2015 0:32)

Jan Tvrdík
Nette guru | 2595
+
0
-

To je divné, AFAIK za normálních okolností Latte vůbec output buffering nepoužívá. Zapínáš to nějak explicitně? Renderuješ tu šablonu do stringu? Používáš {capture}?

Myiyk
Člen | 321
+
0
-

V layoutu jsem to měl obaleno do {block|strip}
Zrušil jsem to a už to funguje.

Myiyk
Člen | 321
+
0
-

Našel jsem funkci, která to omezuje. Je to v vendor/latte/latte/src/Latte/Runtime/Filters.php, funkce strip

Standartní podoba je

	public static function strip($s)
	{
		return preg_replace_callback(
			'#(</textarea|</pre|</script|^).*?(?=<textarea|<pre|<script|\z)#si',
			function ($m) {
				return trim(preg_replace('#[ \t\r\n]+#', ' ', $m[0]));
			},
			$s
		);
	}

Upravil jsem to na

	public static function strip($s)
	{
		return $s;
	}

A funguje to.

Myiyk
Člen | 321
+
0
-

V případě, když tam je hodně dat, tak ta funkce vrací NULL, což dle dokumentace znamená error.

norbe
Backer | 405
+
0
-

Problém je s nastavením pcre.backtrace_limit, viz https://www.drupal.org/node/1840858