PHP中TELNET的正确快捷方式。套接字或cURL

时间:2011-12-07 06:18:05

标签: php sockets curl telnet

PHP中TELNET实现的几乎所有示例都带有套接字( 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 个答案:

答案 0 :(得分:3)

您需要做的是使用NON-Blocking IO,然后使用Poll进行响应。你现在正在做的是等待/挂起一个永远不会发生的响应 - 因此超时。

就我个人而言,我已经在php中编写了很多套接字应用程序,但是我觉得cURL很麻烦,很麻烦,而且非常不安全...只是阅读他们应该感到震惊的错误列表。

阅读优秀的PHP手册以及如何进行轮询IO的许多示例,他们甚至会给你一个示例telnet服务器&amp;客户端。

答案 1 :(得分:2)

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

  

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

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

<强>更新

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

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

答案 2 :(得分:0)

使用pfsockopen代替fopensock ..更快,并保持连接一直存在