Nom de la fonction: socket_set_nonblock ()
Version applicable: PHP 4> = 4.1.0, PHP 5, PHP 7
Utilisation: socket_set_nonblock (ressource $ socket)
Description de la fonction: La fonction socket_set_nonblock () marque la prise donnée en mode non bloquant, ce qui signifie que le processus ne bloque pas lors de la lecture et de l'écriture de données.
paramètre:
Valeur de retour: renvoyez True sur le succès et FAUX en échec.
Exemple:
<?php // 创建套接字$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 设置套接字为非阻塞模式if (socket_set_nonblock($socket)) { echo "套接字设置为非阻塞模式成功!\n"; } else { echo "套接字设置为非阻塞模式失败!\n"; } // 连接到服务器if (socket_connect($socket, '127.0.0.1', 8080) === false) { // 非阻塞模式下,连接可能会立即返回失败$error = socket_last_error($socket); if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) { echo "连接服务器失败:" . socket_strerror($error) . "\n"; } else { echo "连接正在进行中...\n"; } } // 读取数据$data = socket_read($socket, 1024); if ($data === false) { // 非阻塞模式下,如果没有数据可读取,会立即返回false $error = socket_last_error($socket); if ($error != SOCKET_EAGAIN) { echo "读取数据失败:" . socket_strerror($error) . "\n"; } else { echo "没有可读取的数据。\n"; } } // 写入数据$message = "Hello, Server!"; if (socket_write($socket, $message, strlen($message)) === false) { // 非阻塞模式下,如果无法立即写入数据,会立即返回false $error = socket_last_error($socket); if ($error != SOCKET_EAGAIN) { echo "写入数据失败:" . socket_strerror($error) . "\n"; } else { echo "无法立即写入数据。\n"; } } // 关闭套接字socket_close($socket); ?>
Dans l'exemple ci-dessus, nous créons d'abord une prise, puis utilisons la fonction socket_set_nonblock () pour définir la prise sur le mode non bloquant. Ensuite, nous essayons de nous connecter au serveur. Si la connexion échoue, nous déterminerons si la connexion est en cours en fonction du code d'erreur. Ensuite, nous essayons de lire les données. S'il n'y a pas de données lisibles, nous jugerons s'il n'y a pas de données à lire en fonction du code d'erreur. Enfin, nous essayons d'écrire des données. Si les données ne peuvent pas être écrites immédiatement, nous jugerons si elle ne peut pas être écrite immédiatement en fonction du code d'erreur. Enfin, nous fermons la prise.
Notez qu'en mode non bloquant, certaines opérations peuvent revenir immédiatement au lieu de bloquer l'attente. Par conséquent, vous devez gérer la situation correspondante en fonction de la valeur de retour ou du code d'erreur.