Команды Telnet через PHP - проблема с чрезвычайно длительным временем выполнения с использованием класса PHPTelnet

Мне нужно автоматизировать несколько функций наших систем, у которых, к сожалению, нет API, только команды telnet.

Итак, я нашел это: http://www.geckotribe.com/php-telnet/ который по сути является классом Telnet для PHP.

Сначала у меня были странные проблемы, так как он слишком быстро пытался войти в систему, поэтому я добавил дополнительный сон (2) между соединением и вводом имени пользователя и пароля.

Теперь к проблеме: кажется, что после выполнения одной команды, которая выводит только одну строку, следующая (которая является многострочным выводом) зависает в системе на время от 2 минут 15 секунд (в режиме отладки eclipse) до 1 мин. 20 секунд при загрузке браузера (только после того, как я установил тайм-аут на 180 секунд...).

Строка, в которой это происходит: $r.=fread($this->fp,1000); в функции DoCommand() класса.

Вот ссылка pastebin на скрипт, который я пытаюсь выполнить, а также результат, который я в конечном итоге получаю (с модификацией для защиты информации..)

код: http://pastebin.com/TXEHWa05

Вывод: http://pastebin.com/mVFm5HM2

Любые идеи, как отладить причину этого? до сих пор я никогда не нуждался даже в отладчике в своих проектах :( В идеале я хотел бы закончить выполнение 2-3 команд по телнету за 5 секунд максимум.. не больше. (потому что как только мы разберемся с этим, я добавлю функциональность отключить пользователя и т.д..).

Я надеюсь, что кто-то более опытный в использовании PHP с использованием fsockopen может помочь :)


person Carmageddon    schedule 25.11.2010    source источник


Ответы (1)


Цикл, который вызывает этот вызов, считывает 1000 байт данных за раз, пока не получит все данные. Возможно, вызов socket_get_status всегда возвращает значение для «unread_bytes», и это просто зацикливается, пока не сработает ваш принудительный тайм-аут. Возможно, служба на другом конце возвращает довольно большой ответ, и в этом случае вы можете увеличивать длину чтения байтов на 1000 каждый раз, когда он зависает, пока не найдете подходящее число. Кроме того, выполните небольшую отладку с помощью var_dump(), каждый раз выводя результаты fread и socket_get_status, чтобы увидеть, где они зависают.

person oreX    schedule 25.11.2010
comment
Спасибо! Я увеличил его до 8192, и теперь все в порядке, хотя для завершения всей программы все еще требуется 6-10 секунд. - person Carmageddon; 28.11.2010
comment
В чем смысл этого значения? Я имею в виду, я понимаю, что это означает, сколько символов читать, но действительно ли это нужно? мне кажется, это доставляет больше хлопот, чем того стоит. Есть ли способ обойти это? убедиться, что когда-нибудь он не застрянет на 8193 символах... - person Carmageddon; 28.11.2010