在 PHP 中正确和快速的 TELNET 方法。套接字或卷曲

wyx*_*yxa 5 php sockets curl telnet

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后是类似的东西:

$telnet = new TELNETcURL();
print_r($telnet->exec_cmd("<TELNET commands go here>"));    
Run Code Online (Sandbox Code Playgroud)

我在 curl_exec 命令上收到“最大执行时间超过 30 秒”。

问题 2: cURL 实现有什么问题?

Vla*_*mos 2

套接字并不慢。套接字是通信的基础。Curl 使用套接字打开与远程服务器的连接。一切都在套接字上运行(我认为)。我不认为你可以使用curl来使用telnet服务,好吧,这并不完全正确,我想你可以连接并发送单个命令。Curl 的设计考虑到了无状态的 http 协议(您打开连接、发送请求、等待回复并关闭连接)。插座是唯一的选择。

我在curl_exec 命令上收到“最大执行时间超过30 秒”。

我的猜测是远程服务器是罪魁祸首。检查它是否可以使用常规终端客户端工作,或者增加 php ini 中的 max_execution_time 。

更新

似乎可以使用curl进行telnet,请检查: http://www.cs.sunysb.edu/documentation/curl/

但我仍然认为你最好使用套接字。