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

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

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 25 ноября 2010

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

...