Maison  >  Article  >  développement back-end  >  Analyse de la connexion Socket et des problèmes de délai d'expiration des données de lecture et d'écriture en PHP

Analyse de la connexion Socket et des problèmes de délai d'expiration des données de lecture et d'écriture en PHP

不言
不言original
2018-06-02 11:31:561555parcourir

Cet article présente principalement les problèmes de connexion Socket et de délai d'expiration des données de lecture et d'écriture en PHP, et analyse les paramètres associés et les compétences d'utilisation de la connexion Socket. Les amis dans le besoin peuvent s'y référer

Cet article décrit le Socket. en PHP avec des exemples Problèmes de connexion et de lecture et d'écriture des données. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Bien que PHP ait un paramètre de délai d'attente pour se connecter au socket pour la méthode fsockopen(), il n'y a pas de paramètre de délai d'attente pour lire et écrire des données après une connexion réussie comme en C. Peu importe, PHP fournit une série de méthodes de flux pour éviter l'expiration du délai

stream_set_blocking( $fp , false )

Réglez le flux de données en mode blocage pour empêcher les données de en cours de lecture avant la fin. Quittez

Si le mode est faux, le descripteur de socket donné passera en mode non-bloc, s'il est vrai, il passera en mode bloc. Cet effet est similaire à fgets(). lecture à partir du socket. En mode non-bloc, fgets() reviendra immédiatement, tandis qu'en mode bloc, il attendra que les données répondent aux exigences

stream_set_timeout( $fp , 10 )

<.> Définissez le délai d'expiration, qui devrait être une fois la connexion établie avec succès. Ajoutez cette phrase immédiatement, l'unité de paramètre suivante est en secondes

stream_get_meta_data( $fp )

Obtenez l'en-tête /metadata du pointeur du fichier de protocole d'encapsulation, et renvoie un tableau, le format est :

Array
(
  [stream_type] => tcp_socket
  [mode] => r+
  [unread_bytes] => 0
  [seekable] =>
  [timed_out] =>
  [blocked] => 1
  [eof] =>
)

où l'index timed_out est l'information de délai d'attente, si elle a expiré, c'est vrai, s'il n'a pas expiré, c'est faux, nous pouvons utiliser ceci Pour déterminer si le socket a expiré, il convient de noter que cette phrase doit être ajoutée après chaque instruction qui doit être attendue pour, comme fwrite(), fread(), et à chaque fois qu'il est lu, il faut juger s'il a expiré, et une seule fois pour une connexion. Il suffit de définir le délai d'attente stream_set_timeout($fp, 10)

.

Code :

$fp = @fsockopen( $ip , $port, $errNo , $errstr, 30 );
if( !$fp )
{
  return false;
}
else
{
  stream_set_timeout( $fp , 3 ) ;
  //发送数据
  fwrite( $fp , $packet ) ;
  $status = stream_get_meta_data( $fp ) ;
  //发送数据超时
  if( $status[&#39;timed_out&#39;] )
  {
    echo "Write time out" ;
    fclose( $fp );
    return false;
  }
  //读取数据
  $buf = fread( $fp , 16 ) ;
  $status = stream_get_meta_data( $fp ) ;
  //读取数据超时
  if( $status[&#39;timed_out&#39;] )
  {
    echo "Read time out" ;
    fclose( $fp );
    return false;
  }
}

Recommandations associées :

PHP SCOKET envoie des fichiers volumineux et reçoit le tutoriel JAVA_PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn