Большая переменная смарти.

mike

pmcoder
Большая переменная смарти.

Столкунулся с ситуацией, если переменная (текст), передаваемая в шаблон имеет размер 99999 символов - все работает как надо. Как только строка 100000 символов - белый экран, никаких ошибок, в логах пусто. Кто сталкивался с такой проблемой?
Переменная находится в теге textarea:
<textarea>{$var}</textarea>
 

mike

pmcoder
ini_set('display_errors',1);
error_reporting(6143);
Это было сделано самым первым делом.

Дело в том, что скрипт отрабатывает. И отрабатывает без ошибок. Просто смарти отдает пустой результат. Если в шаблоне просто {$var}, то все выводится как надо, если
<textarea>{$var}</textarea> пусто. Проверил в нескольких проектах на смарти. Везде тоже самое.
 

MiRacLe

просто Чудо
$smarty = new Smarty;
...
$smarty->assign('var',str_repeat('x',100000));
$smarty->display('textarea.tpl');

---
<textarea>{$var}</textarea>

"Что я делаю не так?" (с)

Приведи минимальный код, который воспроизводит описанную ситуацию.
 

mike

pmcoder
Приведи минимальный код, который воспроизводит описанную ситуацию.
Твой код и воспроизводит. Только немного подправил для удобства. Вставил пробел чтобы переносы были.

$smarty->assign( 'var' , str_repeat( 'x ' , 50000 ) );
$smarty->display( 'textarea.tpl' ) ;
---
<textarea>{$var}</textarea>

Правда возможно надо будет увеличить число повторения, т.к. в живом шаблоне есть и другие данные.

Я склонен считать, что есть какой-то предел размера шаблона, но чем он ограничен и правильно ли я считаю не знаю. :)
 

Dovg

Продвинутый новичок
AFAIR предел памяти вылился бы в fatal_error
 

mike

pmcoder
Предел памяти точно ни при чем. Стоит 128М... Экперементальным путем проверил, что только при 1М вываливается ошибка о нехватке памяти.
Кроме того, если после
$smarty->display( 'textarea.tpl' ) ;
написать
echo "pass";
то pass выводится без проблем.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
$smarty->error_reporting = E_ALL

-~{}~ 24.07.08 20:08:

+
{debug}
в темплейте.
 

mike

pmcoder
Спасибо конечно за внимание, но я уже знаю как отлаживать php ( в том числе и смарти ) скрипты. :)
 

Angerslave

Новичок
Давай сюда ответ сервера той злополучной страницы вместе с заголовками.
 

mike

pmcoder
Status=OK - 200
Date=Thu, 24 Jul 2008 20:32:11 GMT
Server=Apache/2.2.9 (Win32) mod_ssl/2.2.9 OpenSSL/0.9.8h
X-Powered-By=PHP/5.2.6
Expires=Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control=no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma=no-cache
Content-Length=0
Keep-Alive=timeout=5, max=100
Connection=Keep-Alive
Content-Type=text/html
 

mike

pmcoder
Та вот я и писал выше что проблема именно в смарти... на выходе смарти выдает пустой результат.... я начал разбирать парсер смарти с конца... потом ввиду отсутствия большого количеста времени я отказался от разбора парсера и решил спросить на форуме...
В данный момент я решил проблему аяксом... загружаю пустой
<textarea></textarea> , а потом с помощью аякса загружаю в него содержимое.

Но вопрос оставляю открытым... Если кто сталкивался с таким интересно с чем это связано.
 

mike

pmcoder
Нашел в чем проблема. Вот кусок кода:

PHP:
include "./Smarty.class.php";
$smarty = new Smarty();
$smarty->load_filter('output', 'trimwhitespace');
$smarty->assign( 'var' , str_repeat( 'x ' , 1500000 ) );
$smarty->display( 'textarea.tpl' ) ;
Именно при использовании фильтра trimwhitespace и 5 пхп имеет место следующая ситуация. На 4 пхп все отрабатывает без проблем.

Вот строки, которые вызывали белый экран:
PHP:
    preg_match_all("!<textarea[^>]+>.*?</textarea>!is", $source, $match);
    $_textarea_blocks = $match[0];
    $source = preg_replace("!<textarea[^>]+>.*?</textarea>!is",
                           '@@@SMARTY:TRIM:TEXTAREA@@@', $source);
Жестко конечно придумано. Тут вырезается содержимое textarea с помошью регулярок, а немного дальше оно вставляется назад.

Надо во всех проектах поотключать этот фильтр.
 
Сверху