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実装で何が問題になっていますか?
ソケット...私はソケットがタイムアウトに達した後にのみ接続を閉じているに気づきました。意味、1秒のタイムアウトを設定した場合、ソケットは1秒間(それ以下)実行されます。私はリアルタイムアプリケーションで使用しているので、操作が完了するとすぐにこれを使用する必要があります。小さなタイムアウトを設定すると、操作が完了しないことがあります(操作が長時間かかる場合)、何も受信しません。 cURLを使用するとすぐに完了します。だから私はソケットでそれをどうやって行うのか分からない。お知らせ下さい。 – wyxa
はい、cURLはTELNETをサポートしていますが、PHPで実装する方法はわかりません。私はネット上で実際の例を見つけることはできませんでした。 – wyxa