Position actuelle: Accueil> Derniers articles> Utilisez FSOCOPEN pour détecter si le port de serveur distant est ouvert

Utilisez FSOCOPEN pour détecter si le port de serveur distant est ouvert

gitbox 2025-05-29

Dans le développement quotidien, nous devons parfois vérifier si un port spécifique d'un serveur distant est ouvert, par exemple si un service Web (tel que 80, 443), un service de base de données (comme 3306, 5432), ou un port personnalisé s'exécute normalement. FSOCCKOpen () est une fonction native fournie par PHP qui peut être utilisée pour établir des connexions de socket, ce qui nous permet également de l'utiliser pour un sondage de port simple.

Cet article présentera comment utiliser la fonction fsocckopen () pour détecter si le port de serveur distant est ouvert et fournir des étapes de mise en œuvre et des précautions spécifiques.


1. Qu'est-ce que FsocCkopen ()

FSOCCKOpen () est une fonction utilisée pour ouvrir une connexion réseau ou une connexion de socket UNIX. La syntaxe est la suivante:

 resource|false fsockopen(
    string $hostname,
    int $port,
    int &$error_code = null,
    string &$error_message = null,
    float $timeout = ini_get("default_socket_timeout")
)

Description du paramètre:

  • $ hostname : l'hôte cible, qui peut être un nom de domaine ou une adresse IP.

  • $ port : le numéro de port à connecter.

  • $ error_code (facultatif): code d'erreur lorsque la connexion échoue.

  • $ error_message (facultatif): message d'erreur lorsque la connexion échoue.

  • $ Timeout (facultatif): délai de connexion (secondes).


2. La logique principale de détecter si le port est ouvert

Nous essayons de nous connecter au port de l'adresse spécifiée via fsocckopen () . Si la connexion réussit, nous pouvons penser que le port est ouvert; Sinon, le port est considéré comme fermé ou l'hôte est inaccessible.

Exemple de code:

 <?php

function isPortOpen($host, $port, $timeout = 5)
{
    $errno = 0;
    $errstr = '';
    $connection = @fsockopen($host, $port, $errno, $errstr, $timeout);

    if (is_resource($connection)) {
        fclose($connection);
        return true;
    } else {
        return false;
    }
}

// Exemple:Test gitbox.net de 443 Le port est-il ouvert?
$host = 'gitbox.net';
$port = 443;

if (isPortOpen($host, $port)) {
    echo "port {$port} exister {$host} 上是开放de。";
} else {
    echo "port {$port} exister {$host} Pas ouvert ou inaccessible。";
}

3. Explication détaillée des étapes de l'opération

  1. Définissez l'hôte cible et le numéro de port <br> Déterminez l'adresse du serveur et le port que vous souhaitez détecter, tels que gitbox.net et 443 .

  2. Essayer de se connecter à l'aide de fsocckopen () <br> Utilisez @fsocopen () pour supprimer la sortie d'erreur par défaut et déterminer si la connexion est réussie par la valeur de retour.

  3. Traitement des résultats de la connexion

    • Succès: signifie que le port est ouvert;

    • Échec: indique que le port n'est pas ouvert, ce qui peut être dû au pare-feu du serveur ou que le port n'écoute pas.

  4. Fermez la ressource de connexion <br> Si la connexion réussit, vous devez utiliser fclose () pour fermer la ressource de connexion pour éviter la fuite des ressources.


4. Scénarios applicables

  • Dans le système de surveillance du site Web, vérifiez périodiquement si le port de service est normal;

  • Dans l'outil de déploiement automatisé, confirmez que le service cible est prêt;

  • Détecter rapidement l'accessibilité des ports pendant le développement local et le débogage;

  • Intégrez la fonction de détection de port dans les scripts des outils de fonctionnement et de maintenance.


5. Choses à noter

  • FSoCOpen () ne convient pas aux scénarios de détection de port de concurrence élevés, et son efficacité est relativement faible;

  • Dans certaines configurations de serveur, cette fonction peut être interdite en raison de politiques de sécurité;

  • Lorsque vous utilisez @ pour supprimer la sortie d'erreur, assurez-vous de bien gérer les exceptions;

  • Le serveur détecté peut être configuré avec des listes blanches IP, des pare-feu, etc., ce qui affectera les résultats de détection.