Bon et rapide à TELNET en PHP. Sockets ou cURL
Presque tous les exemples de l'TELNET implémentations en PHP avec des sockets (fsockopen). Cela ne fonctionne pas pour moi, car il faut une quantité inacceptable de temps (~ 60 secondes).
J'ai essayé fsockopen pour d'autres fins, et il a trouvé lent contrairement à friser.
Question #1: Pourquoi les sockets lent?
Mise à jour: j'ai trouvé nous avons besoin de définir stream_set_timeout fonction, et nous pouvons en contrôler la prise de temps d'exécution. Je suis curieux de savoir comment définir le bon délai d'attente ou de la façon de faire "cesser d'attendre" une fois que la réponse est reçue.
Je ne peux pas obtenir la même chose, mis en œuvre avec cURL. Où dois-je mettre les commandes dont j'ai besoin pour envoyer à telnet? Est CURLOPT_CUSTOMREQUEST la bonne option? Je suis en train de faire quelque chose comme ceci:
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);
}
}
Et puis quelque chose de similaire à ceci:
$telnet = new TELNETcURL();
print_r($telnet->exec_cmd("<TELNET commands go here>"));
Je suis "Max durée d'exécution dépasse les 30 secondes" sur curl_exec commande.
Question #2: Quel est le problème avec le cURL mise en œuvre?
OriginalL'auteur wyxa | 2011-12-07
Vous devez vous connecter pour publier un commentaire.
sockets ne sont pas lent. les sockets sont la base pour la communication. Curl utilise des sockets pour ouvrir une connexion au serveur distant. Tout fonctionne sur des sockets (je pense).
Je ne pense pas que vous pouvez utiliser curl pour utiliser un service telnet, eh bien, ce n'est pas tout à fait vrai, je suppose que vous pouvez vous connecter et envoyer une commande unique. Curl a été conçu avec le protocole http à l'esprit qui est apatrides (vous ouvrez une connexion, envoyer une demande, attendre une réponse, et la fermeture de la connexion).
Les Sockets sont la seule option.
Ma conjecture est que le serveur distant est le coupable. vérifiez pour voir si il fonctionne en utilisant un terminal client, ou d'augmenter le max_execution_time dans le php ini.
Mise à JOUR
Il semble qu'il est possible d'utiliser curl pour telnet, vérifiez ceci:
http://www.cs.sunysb.edu/documentation/curl/
Mais je pense toujours que vous êtes mieux à l'aide de sockets.
Oui, cURL prise en charge TELNET, mais je ne sais pas comment l'implémenter en PHP. Je n'ai pas trouvé d'exemple sur le net.
OriginalL'auteur Vlad Balmos
ce que vous devez faire, c'est à l'aide de NON-Blocage IO et puis Scrutin pour la réponse. ce que vous faites maintenant est en attente/suspendu pour une réponse qui ne vient jamais, ainsi que le délai.
Personnellement, j'ai écrit beaucoup de socket applications en php, ils travaillent beaucoup -- et j'ai horreur de roulage comme buggy, encombrant, et très précaire... il suffit de lire leur liste de bogues, vous devriez être consterné.
Aller lire l'Excellent manuel PHP complet avec de nombreux exemples pour savoir comment faire Interrogés IO-ils même vous donner un exemple de serveur telnet & client.
OriginalL'auteur codeslinger
utilisation pfsockopen au lieu de fopensock ..c'est beaucoup plus rapide et maintient la connexion tout le chemin
OriginalL'auteur FoXaWy