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

不言
Libérer: 2023-03-29 14:12:02
original
1611 Les gens l'ont consulté

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 )
Copier après la connexion

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 )
Copier après la connexion

<. 🎜> 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 )
Copier après la connexion

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] =>
)
Copier après la connexion

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;
  }
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal