【发布时间】:2012-01-14 17:17:16
【问题描述】:
几乎所有 PHP 中的 TELNET 实现示例都使用套接字 (fsockopen)。这对我不起作用,因为它需要不可接受的时间(约 60 秒)。
我尝试过 fsockopen 用于其他目的,发现它与 cURL 相比速度较慢。
问题 #1: 为什么套接字这么慢?
更新:我发现我们需要设置stream_set_timeout函数,我们可以控制socket执行时间。我很好奇如何设置正确的超时时间或如何在收到响应后使其“停止等待”。
我无法使用 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 实现有什么问题?
【问题讨论】: