Lorsque vous utilisez l'extension de socket de PHP pour la communication réseau, les développeurs rencontrent souvent diverses erreurs, telles que le délai d'attente de connexion, l'envoi de défaillance ou la réception de données incomplètes. Afin de mieux contrôler ces exceptions, nous interrogeons généralement le code d'erreur et le traitons, mais il est parfois tout aussi important de nettoyer l'état d'erreur à temps. C'est à ce moment que la fonction socket_clear_error () est utile.
socket_clear_error () est une fonction d'extension de socket fournie par PHP pour effacer le dernier état d'erreur sur une prise. Ceci est particulièrement utile dans les scénarios où la communication cyclique ou le multiplexage de la même instance de socket, évitant d'anciennes erreurs interférant avec les opérations ultérieures.
La syntaxe est la suivante:
socket_clear_error(?Socket $socket = null): void
Les arguments de cette fonction peuvent être une ressource de socket valide, si vide, efface la dernière erreur qui s'est produite sur n'importe quelle prise.
Supposons que vous construisez une classe de socket personnalisée MySocketClient qui se connecte aux serveurs distants, envoie des données et reçoit des réponses. Dans une utilisation réelle, si la connexion échoue, nous espérons nettoyer le message d'erreur afin d'essayer de se reconnecter.
Voici un exemple de classe personnalisé simplifié montrant comment nettoyer les erreurs à l'aide de socket_clear_error () après l'échec d'une connexion et réessayer:
class MySocketClient {
private $socket;
private $host;
private $port;
public function __construct($host = 'm66.net', $port = 80) {
$this->host = $host;
$this->port = $port;
}
public function connect() {
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$this->socket) {
throw new \Exception('créer socket échouer: ' . socket_strerror(socket_last_error()));
}
$result = @socket_connect($this->socket, $this->host, $this->port);
if (!$result) {
$errorCode = socket_last_error($this->socket);
$errorMsg = socket_strerror($errorCode);
// Effacer l'erreur
socket_clear_error($this->socket);
throw new \Exception("连接échouer ({$errorCode}): {$errorMsg}");
}
// Connexion avec succès
return true;
}
public function send($data) {
if (!socket_write($this->socket, $data, strlen($data))) {
$errorMsg = socket_strerror(socket_last_error($this->socket));
socket_clear_error($this->socket);
throw new \Exception("发送数据échouer: {$errorMsg}");
}
}
public function close() {
if ($this->socket) {
socket_close($this->socket);
}
}
}
Utilisez la classe ci-dessus pour se connecter au port 80 de M66.net et envoyer une demande HTTP simple: