Bei der Verwendung von PHP für die Netzwerkprogrammierung ist die Funktion von GetHostByName () ein gemeinsames Tool zur Lösung des Hostnamens in der entsprechenden IP -Adresse. In einigen Fällen können Sie jedoch auf den Fehler von GetHostByName () stoßen, der "undefined Host" zurückgibt. Dieser Fehler zeigt normalerweise an, dass der bereitgestellte Hostname nicht behoben werden kann, was dazu führt, dass das Programm nicht fortgesetzt wird. In diesem Artikel werden mehrere häufige Ursachen und Lösungen eingeführt, mit denen Sie dieses Problem lösen können.
Erstens ist der häufigste Grund, dass der von Ihnen angegebene Hostname möglicherweise ein falsches Format oder ein falsches Format enthält. Die Funktion von GetHostByName () erfordert einen gültigen Domänennamen oder Hostnamen. Wenn der von Ihnen eingegebene Hostname falsch ist oder der Domänenname nicht behoben werden kann, gibt die Funktion einen "undefinierten Host" -Fehler zurück.
Problemumgehung : Stellen Sie sicher, dass der von Ihnen eingegebene Hostname oder Domain -Name korrekt ist. Sie können über Ihren Browser auf den Hostnamen zugreifen oder Befehlszeilen-Tools wie Ping verwenden, um zu überprüfen, ob der Host erreichbar ist.
<span><span>ping example.com
</span></span>
GetHostByName () stützt sich auf die DNS -Auflösung, um den Hostnamen in die IP -Adresse umzuwandeln. Wenn die DNS -Konfiguration des Systems falsch ist oder der DNS -Server den Domänennamen nicht beheben kann, wird auch die Funktion einen Fehler zurückgeben.
Problemumgehung : Überprüfen Sie die DNS -Einstellungen des Servers im PHP -Skript. Sie können die Datei /etc/resolv.conf im Linux -System überprüfen, um sicherzustellen, dass der DNS -Server korrekt konfiguriert ist. Zum Beispiel:
<span><span><span class="hljs-built_in">cat</span></span><span> /etc/resolv.conf
</span></span>
Stellen Sie sicher, dass in der Datei eine gültige DNS -Serveradresse vorhanden ist. Wenn nicht, fügen Sie ein öffentliches DNS wie Google hinzu (8.8.8.8 und 8.8.4.4).
Manchmal kann GetHostByName () den Domänennamen aufgrund von DNS -Caching -Problemen nicht beheben, obwohl der Domänenname gültig ist.
Problemumgehung : Löschen Sie den DNS -Cache. Unterschiedliche Betriebssysteme haben unterschiedliche Reinigungsmethoden. Zum Beispiel können Sie auf Linux -Systemen NSCD (Name Service Cache Daemon) neu starten:
<span><span>sudo systemctl restart nscd
</span></span>
Unter Windows -Systemen können Sie den DNS -Cache mit dem folgenden Befehl löschen:
<span><span>ipconfig /flushdns
</span></span>
GetHostByName () ist eine einfache Funktion, hat aber einige Einschränkungen. Zum Beispiel gibt es immer die erste analysierte IP -Adresse zurück. Wenn das Parsen fehlschlägt, wird der ursprüngliche Hostname zurückgegeben, anstatt mehr Fehlerinformationen bereitzustellen. Daher müssen Sie vorsichtig sein, wenn Sie es verwenden.
Problemumgehung : Sie können versuchen, GetAddrinfo () zu verwenden, was eine leistungsstärkere Alternative ist, die weitere Details zur Diagnose des Problems liefert.
<span><span><span class="hljs-variable">$hostname</span></span><span> = </span><span><span class="hljs-string">'example.com'</span></span><span>;
</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getaddrinfo</span></span><span>(</span><span><span class="hljs-variable">$hostname</span></span><span>, </span><span><span class="hljs-literal">null</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$entry</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'IPAdresse: '</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'host'</span></span><span>] . PHP_EOL;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Der Hostname versäumte es, den Namen des Hosts zu lösen'</span></span><span> . PHP_EOL;
}
</span></span>
getAddrinfo () gibt eine Reihe von Informationen zurück, die mehrere IP -Adressen enthalten, die für komplexe Netzwerkanforderungen geeignet sind.
Wenn Ihr PHP -Skript in einer Umgebung ausgeführt wird, in der über einen Proxy -Server auf das Netzwerk zugreift, können die Proxy -Einstellungen die normale Arbeit der GetHostByName () -Funktion beeinträchtigen. Der Proxy -Server leitet möglicherweise keine DNS -Anfragen weiter, was dazu führt, dass der Hostname nicht behoben werden kann.
Problemumgehung : Überprüfen Sie die Proxy -Einstellungen von PHP, um sicherzustellen, dass diese korrekt konfiguriert sind. Sie können die Proxy-Konfiguration von PHP über Ini_Set () festlegen oder sicherstellen, dass Anforderungen normal über Proxy-Einstellungen auf Systemebene geleitet werden können.
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'http.proxy_host'</span></span><span>, </span><span><span class="hljs-string">'proxy.example.com'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'http.proxy_port'</span></span><span>, </span><span><span class="hljs-string">'8080'</span></span><span>);
</span></span>
In einigen Fällen kann eine Firewall verhindern, dass PHP -Skripte auf DNS -Dienste zugreifen. Überprüfen Sie die Einstellungen von Netzwerkverbindungen und Firewall, um sicherzustellen, dass PHP Zugriff auf externe DNS -Server hat.
Problemumgehung : Überprüfen Sie die Firewall -Einstellungen des Servers, um sicherzustellen, dass DNS Anforderungen beheben darf. Sie können den Befehl iptables verwenden, um Firewall -Regeln in Linux -Systemen anzuzeigen oder zu ändern.
<span><span>sudo iptables -L
</span></span>
GetHostByName () ist eine einfache und praktische Funktion, aber seine Einschränkungen können einige Fehler verursachen. Stellen Sie bei der Begegnung auf den Fehler "undefinierter Host" zuerst sicher, dass der eingegebene Hostname korrekt ist, und überprüfen Sie dann die DNS -Konfiguration, Cache -Probleme und Netzwerkverbindungsprobleme. Wenn komplexere Funktionen benötigt werden, sollten Sie stattdessen GetAddrinfo () verwenden. Wenn Sie die oben genannten möglichen Ursachen ausschließen, können Sie den Fehler in der Regel beheben.