Position actuelle: Accueil> Derniers articles> En quoi Socket_Set_Block est-il différent de Stream_Set_Blocking?

En quoi Socket_Set_Block est-il différent de Stream_Set_Blocking?

gitbox 2025-05-26

Dans PHP, le contrôle des modes de blocage et de non-blocage est très important lors de la gestion des communications réseau. socket_set_block et stream_set_blocking sont deux fonctions couramment utilisées. Ils sont tous deux utilisés pour définir le comportement de blocage des sockets ou des flux, mais il existe des différences dans les objets et usages applicables. Cet article présentera les différences entre ces deux fonctions et leurs méthodes d'utilisation en détail.

1. Concepts de base

  • Mode de blocage : les appels de fonction attendront la fin de l'opération, tels que la lecture des données jusqu'à ce que les données soient lisibles, écrivant des données jusqu'à la fin de la transmission et que le programme s'arrête et attendra pendant cette période.

  • Mode non bloquant : l'appel de fonction n'attendra pas la fin de l'opération. Si l'opération ne peut pas être terminée immédiatement, elle reviendra immédiatement et le programme peut continuer à exécuter d'autres tâches.

2. Fonction Introduction

1. Socket_Set_Block

  • Applicable à: Ressources de socket dans une extension de socket PHP (créée via des fonctions telles que socket_create () )

  • Fonction: Définissez la prise sur le mode de blocage.

  • Prototype de fonction:

     bool socket_set_block(resource $socket)
    
  • Valeur de retour: renvoyer vrai pour le succès, renvoyer false pour l'échec

2. Stream_set_blocking

  • Convient pour: des ressources basées sur le flux , telles que la ressource renvoyée par fopen () , stream_socket_client () , ou la ressource Stream convertie par socket_create () via socket_import_stream () .

  • Fonction: Définissez le mode de blocage du débit.

  • Prototype de fonction:

     bool stream_set_blocking(resource $stream, int $mode)
    
  • paramètre:

    • $ stream : Ressources de streaming

    • $ mode : 1 signifie blocage, 0 signifie non bloquant

  • Valeur de retour: renvoyer vrai pour le succès, renvoyer false pour l'échec

3. Différences principales

caractéristiques socket_set_block stream_set_blocking
Ressources applicables Ressources de socket dans les extensions de socket Ressources de streaming PHP (flux de fichiers, flux de réseau, etc.)
Méthode de réglage du mode de blocage Appelez directement sans paramètres supplémentaires Spécifiez le mode de blocage avec le deuxième paramètre (0 ou 1)
Flexibilité d'utilisation Seul le blocage peut être réglé, socket_set_nonblock () est requis pour le non-blocage Le blocage ou le non-bloquant peut être défini
Scénarios applicables Programmation de prises de bas niveau Programmation de flux de réseau de haut niveau

4. Exemple de code

1. Utilisez socket_set_block

 <?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()));
}

socket_set_block($socket); // Défini sur le mode de blocage

// Connectez-vous au serveur
socket_connect($socket, "gitbox.net", 80);

// Envoyer une demande
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Lisez la réponse
$response = '';
while ($out = socket_read($socket, 2048)) {
    $response .= $out;
}

echo $response;

socket_close($socket);
?>

2. Utilisez stream_set_blocking

 <?php
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
    die("Connection failed: $errstr ($errno)");
}

// Défini sur le mode de blocage
stream_set_blocking($stream, 1);

// Envoyer une demande
fwrite($stream, "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n");

// Lisez la réponse
$response = '';
while (!feof($stream)) {
    $response .= fread($stream, 2048);
}

echo $response;

fclose($stream);
?>

5. Résumé

  • SOCKET_SET_BLOCK est spécialement utilisé pour les ressources de socket dans l'extension de socket de PHP et définit directement la prise sur un état de blocage.

  • Stream_Set_Blocking convient à une gamme plus large de ressources de flux et fournit une commutation flexible entre les modes de blocage et de non-blocage.

  • La fonction à choisir dépend principalement du type de ressource que vous utilisez: si vous utilisez une extension de socket pour gérer les sockets, utilisez socket_set_block ; Si vous utilisez des ressources Stream (telles que Stream_Socket_Client ), utilisez Stream_Set_Blocking .

La compréhension de ces deux fonctions et de leurs différences vous aidera à mieux contrôler les données de lecture des données et d'écrire un comportement dans la programmation du réseau PHP et d'optimiser les performances et la réponse du programme.