Forum Webscript.Ru

Программирование => PHP => Тема начата: Candy от 24 Сентября 2003, 22:19:08

Название: ошибка в строке 2907130832
Отправлено: Candy от 24 Сентября 2003, 22:19:08
Возникла очень странная проблема. На основе выбранных из БД значений генерится страница. Но иногда скрипт прекращает свое выполнение с ошибкой о превышении максимального времени выполнения, указывая на строку типа 2907130832. При этом система уходит в непродолжительный нокдаун, и что самое интересное, файл подкачки моментально увеличивается в 3-4 раза. На лицо бесконечный цикл, но где? И почему такая ужасная строка? СУБД думаю тут ни причем, как в принципе и apache тоже. Используются сессии, может в них косяк?

Скрипт работает не стабильно и такие "фокусы" все же происходят, но не всегда. Кто-нибудь встречался с такой проблемой?

заюзано:
   php 4.3.0
   apache 1.3.27
   MySQL 3.23.47
      в общем все из денвера
Название: ошибка в строке 2907130832
Отправлено: ThE0ReTiC от 25 Сентября 2003, 00:28:05
Candy
Да видел, тока в 4.3.1 и больше в 4.3.2
Могу посоветовать выкинуть денвер и поставить все самому руками...
Несколько дней промучаешься, зато будешь знать откуда ноги растут.
к тому же документации на русском о том как это сделать - много
Название: ошибка в строке 2907130832
Отправлено: Tronyx от 25 Сентября 2003, 16:51:05
Цитировать
ThE0ReTiC:
Могу посоветовать выкинуть денвер и поставить все самому руками...
К сожелению глюк это не вылечит :(
Название: ошибка в строке 2907130832
Отправлено: Candy от 25 Сентября 2003, 23:58:46
Tronyx
Похоже дело не в денвере, а в скрипте. Вопрос в каком месте может быть зацикливание, может какой-нибудь дебаггер есть?
Название: ошибка в строке 2907130832
Отправлено: Макс от 26 Сентября 2003, 00:12:40
Candy
в пхп можно и без дебагера обойтись. print_r и echo меня всегда спасали.
Название: ошибка в строке 2907130832
Отправлено: Candy от 26 Сентября 2003, 08:04:50
Макс
Конечно можно, только у меня либо страница загружается целиком без ошибок, либо ничего не загружается и выводится сообщение об ошибке - эхо с принтом тут не помогут.

Вообще такое впечатление, что зацикливает весь скрипт, а не какой-то отдельный кусок. Это видно из того, что ошибка происходит каждый раз в разных инклюдах (кстати их порядка 10-12). Пошатался по форумам, нашел пару похожих тем с этой проблемой, но никто пока не нашел причину возникновения странного бага.

Цитировать
ThE0ReTiC
Да видел, тока в 4.3.1 и больше в 4.3.2

Думаешь баг в конкретной версии php?
Название: ошибка в строке 2907130832
Отправлено: ThE0ReTiC от 26 Сентября 2003, 13:22:32
Цитировать
Candy:
Думаешь баг в конкретной версии php?

ИМХО да.
в 4.3.0 и 4.3.3 я такого вообще ни разу не наблюдал.
а 4.3.2 вообще вызывала срыв стека Апача при рекурсивном вызове функции
Название: ошибка в строке 2907130832
Отправлено: Tronyx от 26 Сентября 2003, 13:55:30
Цитировать
Candy:
Похоже дело не в денвере

Я это и имел ввиду.

Кстати у меня дома кажется 4.3.0 стоит, такой же глюк, не всегда, но бывает
Название: ошибка в строке 2907130832
Отправлено: Candy от 26 Сентября 2003, 14:38:49
Цитировать
ThE0ReTiC
в 4.3.0 и 4.3.3 я такого вообще ни разу не наблюдал.
а 4.3.2 вообще вызывала срыв стека Апача при рекурсивном вызове функции


похоже на это...
Цитировать

http://site-make.narod.ru/mysql.html

Функции в PHP применяются так же, как и в аналогичных алгоритмических языках, хотя в большинстве конкретных областей применения PHP можно обойтись без функций. Их объявление и использование оказываются оправданными только в очень сложных случаях. PHP поддерживает рекурсивный вызов функций, но, поскольку эта система все-таки интерпретирующая, чрезмерная вложенность вызовов приведет к исчерпанию памяти и аварийному завершению скрипта (в окне Web-броузера появятся соответствующие сообщения об ошибке). Примеры рекурсивных функций, которые могут использоваться на сайте, мы рассмотрим, когда речь пойдет о форумах — вывод записей форума проще всего запрограммировать при помощи небольшой рекурсивной процедуры.


судя по всему проблема именно в этом, может стоит обратиться к разработчикам? :-)
Название: ошибка в строке 2907130832
Отправлено: Yukko от 26 Сентября 2003, 14:48:03
Цитировать
Да видел, тока в 4.3.1 и больше в 4.3.2

на phpclub\'e видел жалобу на эту версию, симптомы те же...
Название: ошибка в строке 2907130832
Отправлено: Candy от 26 Сентября 2003, 14:51:13
Вот кстати про рекурсии:
http://comp-science.hut.ru/Progr/Rekursia.html

Цитировать
Обращение к рекурсивной подпрограмме ничем не отличается от вызова любой другой подпрограммы. При этом при каждом новом рекурсивном обращении в памяти создаётся новая копия подпрограммы со всеми локальными переменными. Такие копии будут порождаться до выхода на граничное условие. Очевидно, в случае отсутствия граничного условия, неограниченный рост числа таких копий приведёт к аварийному завершению программы за счёт переполнения стека.
Название: ошибка в строке 2907130832
Отправлено: Tronyx от 26 Сентября 2003, 15:18:42
Нефига. Рекурсия тут не причем, у меня этот глюк был в шаблонизаторе, а там во всём движке нет ни одной рекурсии. Глюк был вообще на довольно простых ошибках.
Название: ошибка в строке 2907130832
Отправлено: ThE0ReTiC от 26 Сентября 2003, 21:10:16
Цитировать
Candy:
может стоит обратиться к разработчикам? :-)

не стоит. в 4.3.3 и 4.3.0 таже функция отрабатывала нормально.
Цитировать
Candy:
Очевидно, в случае отсутствия граничного условия, неограниченный рост числа таких копий приведёт к аварийному завершению программы за счёт переполнения стека.

Это не тот вариант...
если бы рекурсивная функция была составлена неправильно, то это было бы на всех версиях.
И потом в случае с РНР это утверждение неверно, ибо сервер автоматически прерывает выполнение скрипта при достижении max_execution_time, естественно если оно не переопределено в скрипте...
Название: ошибка в строке 2907130832
Отправлено: Candy от 27 Сентября 2003, 18:07:23
проблема вроде разрешилась включением в php.ini безопасного режима:
safe_mode = On
только вот что этот безопасный режим обеспечивает, что урезает и в чем ограничивает?
Название: ошибка в строке 2907130832
Отправлено: Candy от 28 Сентября 2003, 22:11:10
Tronyx
Цитировать
.... Глюк был вообще на довольно простых ошибках.

Интересно каких?