Position actuelle: Accueil> Derniers articles> Solution à "AVERTISSEMENT: socket_accept () s'attend à ce que le paramètre 1 soit une ressource" lors de l'utilisation de socket_accept ()

Solution à "AVERTISSEMENT: socket_accept () s'attend à ce que le paramètre 1 soit une ressource" lors de l'utilisation de socket_accept ()

M66 2025-05-29

Lorsque vous utilisez la fonction socket_accept () de PHP pour la programmation de socket, un message d'avertissement commun est:

 Warning: socket_accept() expects parameter 1 to be resource, bool given

L'erreur signifie: la fonction socket_accept () s'attend à ce que le paramètre reçu soit une ressource, mais en fait il est passé une valeur booléenne (généralement fausse ). Alors, pourquoi une valeur de type booléen est-elle transmise au lieu de la ressource de socket attendue? La cause profonde est qu'une étape dans socket_create () ou socket_bind () ou socket_listten () échoue.

Source d'erreur

Jetons un coup d'œil à une structure de code de serveur de socket typique:

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);

while (true) {
    $client = socket_accept($socket);
    // ...Gérer les connexions du client
}

Si l'une des lignes (comme socket_create () ) renvoie false , alors $ socket n'est pas une ressource de socket valide. Une erreur se produit lorsque l'appel socket_accept ($ socket) : une valeur booléenne (false) est transmise, pas une ressource valide.

Comment localiser le problème

Nous pouvons utiliser des fonctions socket_last_error () et socket_streror () pour sortir des informations d'erreur détaillées:

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() échouer: " . socket_strerror(socket_last_error()) . "\n");
}

if (!socket_bind($socket, '0.0.0.0', 8080)) {
    die("socket_bind() échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() échouer: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $msg = "Accueillir M66 Socket Servir!\n";
    socket_write($client, $msg, strlen($msg));
    socket_close($client);
}

De cette façon, il est plus facile de localiser quel appel de fonction échoue, résolvant ainsi le problème sous-jacent.

Causes et solutions courantes

  1. Autorisations insuffisantes <br> Si vous essayez de se lier à un port inférieur à 1024, tel que 80 ou 21, il échouera en raison d'autorisations insuffisantes. La solution consiste à utiliser des ports supérieurs à 1024 ou à exécuter le script avec les privilèges de l'administrateur.

  2. Le port a été occupé <br> Si le port a été occupé par d'autres processus, socket_bind () échouera. Vous pouvez utiliser des commandes telles que netstat -tlnp (linux) ou netstat -ano (windows) pour afficher l'occupation du port.

  3. Adresse de liaison illégale <br> Si l'adresse IP spécifiée est illégale ou si la machine n'est pas configurée, socket_bind () échouera. Assurez-vous que l'adresse liée est légale et valide, telle que 0.0.0.0 (liant tous les IP) ou l'IP intranet réelle de la machine.

  4. Extension de socket PHP ne se charge pas correctement <br> Assurez-vous que l'extension Sockets est activée dans php.ini . Peut être vérifié via phpinfo () ou extension_loade («sockets») .

Exemple: code de serveur de socket PHP disponible complet disponible

 <?php

$host = '0.0.0.0';
$port = 9000;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() échouer: " . socket_strerror(socket_last_error()) . "\n");
}

if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "Écoute: $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() échouer: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $welcome = "Bienvenue à visiter m66.net de Socket Servir!\n";
    socket_write($client, $welcome, strlen($welcome));
    socket_close($client);
}

socket_close($socket);

Résumer

Lorsque vous rencontrez une erreur de "s'attend à ce que le paramètre 1 soit une ressource" lors de l'utilisation de socket_accept () , ne pensez pas directement que le problème se trouve dans socket_accept () , mais vous devez revenir en arrière si le socket_create () , socket_bind () et socket_listten () précédent, a été exécuté avec succès. En ajoutant du jugement d'erreur et de la sortie du journal, vous pouvez rapidement localiser le problème et éviter de perdre du temps sur les mauvais liens.

J'espère que cet article peut vous aider à comprendre ce problème commun et à maîtriser le positionnement et les solutions.