Постоянное время выполнения объекта PHP Максимальный уровень вложенности функций - PullRequest
0 голосов
/ 01 октября 2011

Я достигаю максимального уровня вложенности функций (полный список в конце вопроса). Я понимаю, что решение этого вопроса - xdebug.max_nesting_level, но каковы его последствия? Кроме того, как я могу лучше реализовать свой код.

Я пишу IRC-клиент, который сейчас много себя называет.

стек вызовов (в сложенном виде)

#     |    Time        |    Memory     |    Function           |    Location
1     |    0.0010      |    800152     |    {main}( )          |    ..\index.php:0
2     |    0.0010      |    802416     |    IRCBot->__construc |    ..\index.php:225
3     |    0.1104      |    804368     |    IRCBot->cont( )    |    ..\index.php:34
4     |    0.1945      |    814592     |    IRCBot->cont( )    |    ..\index.php:144
......|................|...............|.......................|.....................
96    |    113.8191    |    1121560    |    IRCBot->cont( )    |    ..\index.php:144
97    |    114.0116    |    1126928    |    IRCBot->cont( )    |    ..\index.php:144
98    |    114.2020    |    1132384    |    out( )             |    ..\index.php:105
99    |    114.2020    |    1132384    |    flush2( )          |    ..\index.php:14

Я знаю, что могу решить эту проблему, увеличив max_nesting_level, но что тогда произойдет, когда уровень вложенности достигнет нового максимума? Кроме того, это способ, которым я делаю это плохо для памяти и т. Д.

function cont($config) {
    $data = fgets($this->socket, 256);
    $this->cont($config);
}

Вопросы:

Будет ли увеличение max_nesting_level увеличивать нагрузку на мой сервер?

Есть ли способ реинжиниринга этого кода, чтобы избежать этой проблемы?

Разве плохо запускать такие PHP-скрипты при установке CGI?

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Конечно, цикл while будет более эффективным.И я также считаю, что вы действительно хотите хранить всю дату, которая возвращается из сокета, и не перезаписывать содержимое $ data каждый раз.Кроме того, здесь не рекомендуется передавать переменную $ config.Вот обновленная версия:

function cont() {
    while (!feof($this->socket)) {
        fgets($this->socket, 256);
    }
}
1 голос
/ 01 октября 2011

Рекурсия дорогая как с точки зрения памяти, так и с точки зрения вычислений, и если вы уже проходите 100 вызовов, это должно предупредить вас о том, что это неправильное применение рекурсивного вызова.

Для получения данных из сокета это абсолютно не проблема, которая должна быть решена с помощью рекурсии.

...