Dans la programmation du réseau PHP, Socket est une méthode de communication sous-jacente qui permet aux développeurs de contrôler plus de manière flexible l'échange de données entre les clients et les serveurs. Cependant, en raison de ses caractéristiques sous-jacentes, les programmeurs doivent gérer eux-mêmes les ressources et la gestion des erreurs. Cet article discutera d'un problème commun mais facilement négligé: les conséquences de l'oubli de réinitialiser la prise après avoir appelé socket_clear_error () .
socket_clear_error () est une fonction fournie par PHP pour effacer l'état d'erreur enregistré dans la dernière opération de socket. Il est généralement utilisé avec socket_last_error () , qui est utilisé pour obtenir le code d'erreur de la dernière opération de socket.
L'utilisation est la suivante:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "La création a échoué: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
}
L'intention d'origine de cette fonction est de permettre aux développeurs de savoir clairement si l'erreur actuelle est nouvelle ou laissée par l'opération précédente lors de l'exécution de plusieurs opérations de socket.
De nombreux développeurs effacent habituellement le code d'erreur après avoir rencontré la création de socket ou la défaillance de la connexion, puis continuent d'utiliser cet objet de socket pour effectuer la prochaine opération, comme la connexion à nouveau ou l'envoi de données. Cependant, cette pratique peut entraîner une série de problèmes si la prise n'est pas réinitialisée.
Considérez l'exemple suivant:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "créer socket échouer: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
}
// Oublié de se réinitialiser socket
$result = socket_connect($socket, "m66.net", 80);
if ($result === false) {
echo "连接échouer: " . socket_strerror(socket_last_error()) . PHP_EOL;
}
Dans ce scénario, si socket_create () ne parvient pas, false est renvoyé et le prochain socket_connect () est de fonctionner sur une ressource non valide. Cela ne réussira pas seulement, mais peut également amener PHP à lancer un avertissement ou même à interrompre l'exécution du programme.
Lorsque vous appelez socket_connect () , socket_send () ou d'autres fonctions de socket, si le entrant est faux ou corrompu, il entraînera une erreur d'exécution sérieuse.
Effacer le code d'erreur mais ne pas résoudre le problème sous-jacent (c'est-à-dire la prise non valide) entraînera la confusion des messages d'erreur ultérieurs. Les développeurs peuvent ignorer la cause réelle de l'erreur lors du dépannage des problèmes.
Dans un environnement où les opérations de socket multiples sont simultanées, une prise mal initialisée participe au processus d'E / S, ce qui peut entraîner la transmission des données comme prévu, et la logique métier entraînera également des erreurs.
Après avoir appelé socket_clear_error () pour effacer le code d'erreur, vous devez confirmer si la prise doit être réinitialisée:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "La création a échoué: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
// 重新créer socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("再次créer socket échouer: " . socket_strerror(socket_last_error()));
}
}
$result = socket_connect($socket, "m66.net", 80);
if ($result === false) {
echo "连接échouer: " . socket_strerror(socket_last_error()) . PHP_EOL;
}
Cela évite l'utilisation d'une prise non valide ou non définie dans les opérations suivantes.
socket_clear_error () est un outil auxiliaire pour améliorer la précision de la gestion des erreurs, mais il ne corrige pas le socket lui-même. Dans le développement réel, vous devez vous souvenir: une fois que la création de socket échoue ou échoue, vous devez la recréer au lieu de continuer à utiliser les anciennes ressources . Sinon, l'échec de la communication est au moins, et au pire, cela conduira à la logique de l'ensemble de l'application et provoquera même des risques de sécurité.
Ce n'est qu'en développant de bonnes habitudes de gestion des erreurs et de gestion des ressources que nous pouvons vraiment écrire une application réseau PHP robuste et fiable.