LINUX.ORG.RU

ограничение на рекурсию в php


0

0

день добрый.

есть ли сабж? где можно посмотреть? можно ли увеличить?
пробовал вызвать рекурсивно 10000 раз функцию: 
var $file;
        function test($n=1)
        {
            fwrite($this->file, $n."\n");
            if ($n<10000)
                $this->test($n+1);
        }

        function ftest()
        {
            $this->file=fopen("test.txt", "a+");
            $this->test();
            fclose($this->file);
        }
 
в файле 1466 записей.


function test($n=1)
{
    echo "$n<br>\n";
    if ($n<10000)
        $this->test($n+1);
}

function ftest()
{
    $this->test();
}
 
в окне 1292 записи.

скрипт просто останавливается. ошибок не выдает.
в php.ini ничего относящегося к вопросу не найдено.

а хочется именно 10000 :)

что я делаю не так?

Весьма возможно, что решение проблемы кроется в таймауте Apache'а на выполнение скрипта. Советую покопать в эту сторону. Но это всё стрго IMHO....

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

оно выполняется буквально за секунды 2, так что... пока мимо...

занятно. разослал этот тест друьям -- у всех по разному выполнилось :)

в зависимости от версии пхп есть результаты от 823 до 5735 :)))

Rastafarra ★★★★
() автор топика

М-м-м... В общем-то, ничего удивительного. Скорее всего, этот дебильный язычок даже хвостовую рекурсию не разворачивает. И стек тю-тю.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Действительно, вот истинный критерий дебильности языка: умение развернуть хвостовую рекурсию!

Тогда из всех императивных языков что я знаю -- все дебильные, за исключением, возможно, только Oz. Да и тот не чисто императивный.

Shmuma
()
Ответ на: комментарий от Shmuma

> Действительно, вот истинный критерий дебильности языка: умение развернуть хвостовую рекурсию!

и тем не менее не работает. факт. покажите как сделать, чтобы работало :)

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Rastafarra

Можно попробовать переписать код, чтобы он не использовал рекурсивные фызовы функций(как правило это решается использованием самописного стека). Кроме того, в качестве побочного эффекта, наверняка такой код будет шустрее. И дело тут не в языке. Сам по себе вызов функции накладен по ресурсам, тем более рекурсивный, тем более, глубиной 10000 :-).

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

> Можно попробовать переписать код, чтобы он не использовал рекурсивные фызовы функций(как правило это решается использованием самописного стека)

и это называется легкость языка? ;)

блин, писать много...

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Shmuma

> критерий дебильности языка: умение развернуть хвостовую рекурсию НЕумение. Да, критерий неплохой. Кстати, gcc разворачивать хвостовую рекурсию АФАИК умеет.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

> критерий дебильности языка: умение развернуть хвостовую рекурсию

НЕумение. Да, критерий неплохой. Кстати, gcc разворачивать хвостовую рекурсию АФАИК умеет.

Miguel ★★★★★
()

Да, php имеет ограничение на глубину вызовов функций :)

catap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.