Баг в LS 1.0 при выполнении "cut"

Здравствуйте, коллеги!
Кто нибудь сталкивался с там, что «cut» не срабатывает?
В силу специфики мне приходится публиковать большие тексты, размер топика пришлось увеличить с 15 000 символов до 150 000. При публикации топика такого размера «cut» не обрезает текст и на главную топик вываливается в полном объеме. На версии движка 0.51 такого вроде не наблюдалось.

29 комментариев

avatar
смотрите лог ошибок сервера.
возможно у вас памяти не хватает для запуска машины регулярных выражений.
avatar
Благодарю Вас! Только у меня виртуальный хостинг, а где там смотреть я не знаю…
avatar
либо в корне сайта файл error_log либо в панели управления
avatar
Доброго дня!
Посмотрел лог ошибок, там только записи такого типа:
[Sat Aug 04 12:58:37 2012] [error] [client ****.***.***.***] PHP Notice: Undefined index: img_file in /var/www/********/data/www/********.com/classes/actions/ActionAjax.class.php on line 1058, referer: http://********.com/topic/add
avatar
Попробуйте сами — возьмите какой нибудь длинный текст, подставьте его в топик и посмотрите, что кат не работает...((
avatar
На локале попробовал — работает.
avatar
h777.ru — убедитесь сами. Кат стоит после 2-й строки, а обрезано где-то очень далеко…
avatar
  • aex
  • 0
avatar
у меня автокат стоит, это не помешает?
avatar
Не должен, это же стандартная функция.
avatar
Вообщем, проблема по-прежнему актуальна! Подскажите, куда копать....?
avatar
опс… проблема усугубилась… Оказывается, cut срабатывает, однако, совсем не в том месте, где он стоит, где-то глубоко в тексте. Посмотрите статью на пробном сайте h777.ru
avatar
а еще оказывается, что если cut в топик вообще не поставить, он все равно обрежет текст…
avatar
А здесь это не весь текст поместился?
avatar
Ради пробы поставил себе сейчас в топик роман Корецкого Найти шпиона. Не знаю сколько там знаков, но здоровенный.:) Прекрасно обрезало, там, где и надо.
avatar
У меня в топике стоит:

Стивен Кови

СЕМЬ НАВЫКОВ ПРЕУСПЕВАЮЩИХ ЛЮДЕЙ
(ВОЗРОЖДЕНИЕ ЭТИКИ ХАРАКТЕРА)
«7 Habits of Highly Effective People»<cut>

Книга вышла в минском издательстве «Парадокс» в 1996 г.


Посмотрите на главной, где обрезает кат…
avatar
А пробовал сделать, как я там тебе написал, без ката?
avatar
Может кат просто не понимает твои пробелы в тексте? :)
avatar
Небольшие топики кат обрезает правильно. А вот большие — нет. Сегодня попробую увеличивать размер топика, при котором кат начинает глючить…
avatar
Итак, эксперимент!
В текстовый файл скопировал большой текст. (что бы убрать все форматирование и пр.) Потом скопировал это текст в Word. Выделил кусок размером 149 000 символов с пробелами и стал размещать в топик. При попытке опубликовать, вылетало сообщение, что размер текста превышает 150 000 символов. Постепенно удаляя куски текста, смог опубликовать текст. При этом, скопировав кусок опубликованного текста в Word обнаружил, что размер текста составляет 143 000 символов с пробелами. При этом тег cut не ставился, однако текст на главной был обрезан, и на главную до «читать далее» было выведено около 35 000 символов.
Попытки поставить тег cut ни к чему не привели — текст по прежнему обрезался по 35 000 символов. Тогда я стал удалять куски текста, что бы сократить его и узнать, при каком количестве символов сработает cut. Cut перестал срабатывать при размере текста более 53 000 символов.
Теперь два вопроса — почему и что делать..?
avatar
для начала отключите плагин автокат. Все тесты проведите без него
avatar
все эксперименты проводятся на чистом движке без всяких плагинов
avatar
Даже самому интересно стало :) И тогда, как говорится в одном бессмертном фильме, пойдем простым логическим путем. :) Что происходит при выводе топика? Он читается и проверяется на наличие в тексте тега cut. Т.е. парсится по регулярным выражениям. При коротких текстах, этот тег находится без проблем и выводится правильно. При больших идет сбой. Чем отличается маленький текст от большого? Размером, который диктует время проверки этого текста на наличие тега cut. Значит, вероятно не хватает этого времени, или, как правильно заметил уважаемый PSNet памяти для запуска машины регулярных выражений. Наверно, и разработчиик, предвидел такие моменты для слабых серверов и не зря предусмотрел варианты указания лимита вывода текста в топике. Как можно проверить эту теорию? 1.Если есть возможность, проверить на другом сервере, например, поставив на свой локальный. 2. Уменьшить количество знаков в топике. 3. Использовать вместо тега cut модификатор смарти truncate. В этом случае, текст, конечно, тоже будет парситься, т.е. будет происходить поиск по тексту, но тут уже для вывода анонса будет прямой приказ, на вывод определенного количества знаков, независимо от того, найден ли в тексте тег cut. Проверь эти варианты, ты ничего не теряешь, а вдруг получится :)
avatar
150 000 символов, конечно многовато для блога. Но проблема, видимо, не в движке. На просторах интернета наткнулся на такую фразу:
The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE is compiled with the default internal linkage size of 2
Честно говоря, совсем недавно пересекся с LS, да и опыта мало. Поэтому моё решение совсем не идеально, а то и вовсе… Короче, в /engine/modules/text/Text.class.php нашел функцию Cut($sText) и чуток её подправил. А именно, разделил входной параметр функцией str_split(), и дальше работал с первым его фрагментом.
avatar
И что получилось?
avatar
Ты все мучаешься? :) Я ж тебе писал, замени в topic_topic.tpl строчку {$oTopic->getTextShort()} на {$oTopic->getText()|truncate:250:"… "}, и у тебя в анонсе топика всегда будет выводить 250 знаков, без всякого ката. И не парься :)
  • aex
  • 0
avatar
Это какой-то армейский метод :) Заморочка то в другом. Система обрезает топик не на лету, а при создании. В самой таблице topic_content есть два поля — topic_text и topic_text_short. В последнее и записывается текст до ката. Думаю, вы это знаете. Но при большом тексте не отрабатывает регулярка. Поэтому в поле короткого текста пишется текст целиком. Как я понимаю, что getText(), что getTextShort() вернут одно и то же. Т.е. так мы проблему прикроем, но не решим.
avatar
Простые решения — они самые верные :) А копаться в регулярках… оно ему надо? :)
avatar
У меня лимит 1 миллион (в постах пишутся рассказы, нельзя ограничивать поэтов =))
Решил проблему 1 строчкой
index.php (где-то в начало)
ini_set('pcre.backtrack_limit', '1000000'); //Поставьте ваше значение, скажем для автора 150к
  • WAYS
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.