2011-12-07 14 views
4

PHPのTELNET実装のほとんどすべての例は、ソケット(fsockopen)を使用しています。これは、受け入れがたい時間(〜60秒)がかかるため、私にとってはうまくいかない。PHPのTELNETへの適切かつ高速な方法。ソケットまたはcURL

私は他の目的のためにfsockopenを試しましたが、それはcURLとは対照的に遅いことがわかりました。

質問#1:なぜソケットが遅いのですか?

更新:私はstream_set_timeoutの機能を設定する必要があり、ソケットの実行時間を制御できることがわかりました。私は、適切なタイムアウトを設定する方法や、応答が受信されたらそれを「停止待ち」にする方法が不思議です。


私は同じことをcURLで実装することはできません。私はTelnetに送るべきコマンドをどこに置くべきですか? CURLOPT_CUSTOMREQUESTは適切なオプションですか?私はcurl_execコマンドの「最大実行時間が30秒を超えて」取得しています

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

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

} 

そして、これに類似した何か:私はこのような何かをやっています。

質問#2: cURL実装で何が問題になっていますか?

答えて

2

ソケットが低速ではありません。ソケットは通信の基礎です。 Curlはソケットを使用してリモートサーバーへの接続を開きます。すべてがソケット上で動作する(私は思う)。 curlを使ってtelnetサービスを使うことはできませんが、それはまったく真実ではありません。私は接続して1つのコマンドを送ることができると思います。 Curlはステートレスなhttpプロトコルを念頭に置いて設計されています(接続を開き、要求を送信し、応答を待ち、接続を閉じる)。 ソケットは唯一のオプションです。

curl_execコマンドで "Max execution time exceeded 30 seconds"が表示されます。

私の推測では、リモートサーバーが原因です。通常のターミナルクライアントを使用しているかどうかを確認するか、php iniのmax_execution_timeを増やしてください。

UPDATE

このチェック、telnetのためにカールを使用することが可能であると思われる: http://www.cs.sunysb.edu/documentation/curl/

をしかし、私はまだあなたがソケットを使用したほうが良いと思います。

+0

ソケット...私はソケットがタイムアウトに達した後にのみ接続を閉じているに気づきました。意味、1秒のタイムアウトを設定した場合、ソケットは1秒間(それ以下)実行されます。私はリアルタイムアプリケーションで使用しているので、操作が完了するとすぐにこれを使用する必要があります。小さなタイムアウトを設定すると、操作が完了しないことがあります(操作が長時間かかる場合)、何も受信しません。 cURLを使用するとすぐに完了します。だから私はソケットでそれをどうやって行うのか分からない。お知らせ下さい。 – wyxa

+0

はい、cURLはTELNETをサポートしていますが、PHPで実装する方法はわかりません。私はネット上で実際の例を見つけることはできませんでした。 – wyxa

3

あなたがしなければならないことは、NON-Blocking IOを使用して応答をポーリングすることです。あなたが今やっていることは決して来ない応答のために待っている/ぶら下がっているのでタイムアウトです。

個人的に私はPHPでたくさんのソケットアプリケーションを書いています。彼らはうまく動作します。私はバグとして扱いにくく、扱いにくく、非常に安全ではありません。

Polled IOを実行する方法の多くの例を示した優秀なPHPマニュアルを読んでください。彼らはあなたにも例telnetサーバー&クライアントを提供しています。

+0

また、ファイアウォールによってブロックされていないことを確認してください – codeslinger

0

はるかに高速代わりにfopensockの..itsの使用pfsockopenとアライブ接続を維持し、すべての方法

関連する問題