Правильный и быстрый способ TELNET на PHP. Розетки или cURL - PullRequest
4 голосов
/ 07 декабря 2011

Почти все примеры реализаций TELNET в PHP имеют сокеты ( fsockopen ). Это не работает для меня, потому что это занимает недопустимое количество времени (~ 60 секунд).

Я попытался fsockopen для других целей и нашел его медленным в отличие от cURL.

Вопрос № 1: Почему медленные сокеты?

Обновление: Я обнаружил, что нам нужно установить функцию stream_set_timeout , и мы можем контролировать время выполнения сокета. Мне любопытно, как установить правильное время ожидания или как заставить его «перестать ждать» после получения ответа.


Я не могу реализовать то же самое с помощью cURL. Где я должен поместить команды, которые мне нужно отправить в telnet? CURLOPT_CUSTOMREQUEST является правильным вариантом? Я делаю что-то вроде этого:

class TELNETcURL{

    public $errno;
    public $errstr;
    private $curl_handle;
    private $curl_options = array(
        CURLOPT_URL => "telnet://XXX.XXX.XXX.XXX:<port>",
        CURLOPT_TIMEOUT => 40,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_HEADER => FALSE,
        CURLOPT_PROTOCOLS => CURLPROTO_TELNET
    );

    function __construct(){
        $this->curl_handle = curl_init();
        curl_setopt_array($this->curl_handle, $this->curl_options);
    }

    public function exec_cmd($query) {
        curl_setopt($this->curl_handle, CURLOPT_CUSTOMREQUEST, $query."\r\n");
        $output = curl_exec($this->curl_handle);
        return $output;
    }

    function __destruct(){
        curl_close($this->curl_handle);
    }

}

А потом что-то похожее на это:

$telnet = new TELNETcURL();
print_r($telnet->exec_cmd("<TELNET commands go here>"));    

По команде curl_exec получено сообщение "Максимальное время выполнения превысило 30 секунд".

Вопрос № 2: Что не так с реализацией cURL?

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

что вам нужно сделать, это использовать NON-Blocking IO и затем Poll для ответа. то, что вы делаете сейчас, - это ожидание / ожидание ответа, который никогда не приходит - таким образом, тайм-аут.

Лично я написал много приложений для сокетов на php, они прекрасно работают - и я ненавижу cURL как глючный, громоздкий и крайне небезопасный ... просто прочитайте их список ошибок, вы должны быть потрясены.

Прочтите превосходное руководство по PHP вместе со многими примерами того, как выполнять опрашиваемый ввод-вывод, они даже дают вам пример telnet-сервера и клиента.

2 голосов
/ 07 декабря 2011

розетки не медленные.розетки являются основой для общения.Curl использует сокеты, чтобы открыть соединение с удаленным сервером.Все работает на сокетах (я думаю).Я не думаю, что вы можете использовать curl для использования службы telnet, ну, это не совсем так, я думаю, вы можете подключиться и отправить одну команду.Curl был разработан с учетом протокола http, который не имеет состояния (вы открываете соединение, отправляете запрос, ждете ответ и закрываете соединение).Сокеты - единственный вариант.

Я получаю «Максимальное время выполнения превысило 30 секунд» по команде curl_exec.

Я предполагаю, что виновным является удаленный сервер.проверьте, работает ли он, используя обычный клиент терминала, или увеличьте max_execution_time в php ini.

UPDATE

Кажется, можно использовать curl для telnet,проверьте это: http://www.cs.sunysb.edu/documentation/curl/

Но я все еще думаю, что вам лучше использовать сокеты.

0 голосов
/ 20 февраля 2014

используйте pfsockopen вместо fopensock ..it намного быстрее и поддерживает постоянную связь

...