Почти все примеры реализаций 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?