Forum Webscript.Ru
Программирование => PHP => Тема начата: Candy от 24 Сентября 2003, 22:19:08
-
Возникла очень странная проблема. На основе выбранных из БД значений генерится страница. Но иногда скрипт прекращает свое выполнение с ошибкой о превышении максимального времени выполнения, указывая на строку типа 2907130832. При этом система уходит в непродолжительный нокдаун, и что самое интересное, файл подкачки моментально увеличивается в 3-4 раза. На лицо бесконечный цикл, но где? И почему такая ужасная строка? СУБД думаю тут ни причем, как в принципе и apache тоже. Используются сессии, может в них косяк?
Скрипт работает не стабильно и такие "фокусы" все же происходят, но не всегда. Кто-нибудь встречался с такой проблемой?
заюзано:
php 4.3.0
apache 1.3.27
MySQL 3.23.47
в общем все из денвера
-
Candy
Да видел, тока в 4.3.1 и больше в 4.3.2
Могу посоветовать выкинуть денвер и поставить все самому руками...
Несколько дней промучаешься, зато будешь знать откуда ноги растут.
к тому же документации на русском о том как это сделать - много
-
ThE0ReTiC:
Могу посоветовать выкинуть денвер и поставить все самому руками...
К сожелению глюк это не вылечит :(
-
Tronyx
Похоже дело не в денвере, а в скрипте. Вопрос в каком месте может быть зацикливание, может какой-нибудь дебаггер есть?
-
Candy
в пхп можно и без дебагера обойтись. print_r и echo меня всегда спасали.
-
Макс
Конечно можно, только у меня либо страница загружается целиком без ошибок, либо ничего не загружается и выводится сообщение об ошибке - эхо с принтом тут не помогут.
Вообще такое впечатление, что зацикливает весь скрипт, а не какой-то отдельный кусок. Это видно из того, что ошибка происходит каждый раз в разных инклюдах (кстати их порядка 10-12). Пошатался по форумам, нашел пару похожих тем с этой проблемой, но никто пока не нашел причину возникновения странного бага.
ThE0ReTiC
Да видел, тока в 4.3.1 и больше в 4.3.2
Думаешь баг в конкретной версии php?
-
Candy:
Думаешь баг в конкретной версии php?
ИМХО да.
в 4.3.0 и 4.3.3 я такого вообще ни разу не наблюдал.
а 4.3.2 вообще вызывала срыв стека Апача при рекурсивном вызове функции
-
Candy:
Похоже дело не в денвере
Я это и имел ввиду.
Кстати у меня дома кажется 4.3.0 стоит, такой же глюк, не всегда, но бывает
-
ThE0ReTiC
в 4.3.0 и 4.3.3 я такого вообще ни разу не наблюдал.
а 4.3.2 вообще вызывала срыв стека Апача при рекурсивном вызове функции
похоже на это...
http://site-make.narod.ru/mysql.html
Функции в PHP применяются так же, как и в аналогичных алгоритмических языках, хотя в большинстве конкретных областей применения PHP можно обойтись без функций. Их объявление и использование оказываются оправданными только в очень сложных случаях. PHP поддерживает рекурсивный вызов функций, но, поскольку эта система все-таки интерпретирующая, чрезмерная вложенность вызовов приведет к исчерпанию памяти и аварийному завершению скрипта (в окне Web-броузера появятся соответствующие сообщения об ошибке). Примеры рекурсивных функций, которые могут использоваться на сайте, мы рассмотрим, когда речь пойдет о форумах — вывод записей форума проще всего запрограммировать при помощи небольшой рекурсивной процедуры.
судя по всему проблема именно в этом, может стоит обратиться к разработчикам? :-)
-
Да видел, тока в 4.3.1 и больше в 4.3.2
на phpclub\'e видел жалобу на эту версию, симптомы те же...
-
Вот кстати про рекурсии:
http://comp-science.hut.ru/Progr/Rekursia.html
Обращение к рекурсивной подпрограмме ничем не отличается от вызова любой другой подпрограммы. При этом при каждом новом рекурсивном обращении в памяти создаётся новая копия подпрограммы со всеми локальными переменными. Такие копии будут порождаться до выхода на граничное условие. Очевидно, в случае отсутствия граничного условия, неограниченный рост числа таких копий приведёт к аварийному завершению программы за счёт переполнения стека.
-
Нефига. Рекурсия тут не причем, у меня этот глюк был в шаблонизаторе, а там во всём движке нет ни одной рекурсии. Глюк был вообще на довольно простых ошибках.
-
Candy:
может стоит обратиться к разработчикам? :-)
не стоит. в 4.3.3 и 4.3.0 таже функция отрабатывала нормально.
Candy:
Очевидно, в случае отсутствия граничного условия, неограниченный рост числа таких копий приведёт к аварийному завершению программы за счёт переполнения стека.
Это не тот вариант...
если бы рекурсивная функция была составлена неправильно, то это было бы на всех версиях.
И потом в случае с РНР это утверждение неверно, ибо сервер автоматически прерывает выполнение скрипта при достижении max_execution_time, естественно если оно не переопределено в скрипте...
-
проблема вроде разрешилась включением в php.ini безопасного режима:
safe_mode = On
только вот что этот безопасный режим обеспечивает, что урезает и в чем ограничивает?
-
Tronyx
.... Глюк был вообще на довольно простых ошибках.
Интересно каких?