Ztráta obsahu bloku s velikostí nad 256kB
- Myiyk
- Člen | 321
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
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
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
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
V případě, když tam je hodně dat, tak ta funkce vrací
NULL
, což dle dokumentace znamená error.
- norbe
- Backer | 405
Problém je s nastavením pcre.backtrace_limit, viz https://www.drupal.org/node/1840858