PHPでは、 GetServbyName()関数を使用して、サービス名( HTTPなど)に基づいてサービスの対応するポート番号を取得します。サービスで使用されているポート番号を表す整数を返します。サービス名が無効であるか登録されていない場合、関数はnull値を返します。 getservbyname()がnull値を返す場合、通常、クエリのサービス名に問題があることを意味します。この記事では、問題を見つけて解決するのに役立つ一般的な原因と対応するソリューションを紹介します。
最も一般的な理由の1つは、getServbyName()関数で渡されたサービス名のスペルミスです。たとえば、HTTPサービスのポートを取得しようとする場合、 HTTPまたはHTTPSとして誤って記述される場合があります(ただし、プロトコルエラーである可能性がありますが、タイプミスである可能性があります)。
渡されたサービス名が正確に正しく、 /etc /servicesファイルにリストされているサービス名と一致していることを確認してください。
/etc /servicesファイルを確認して、サービス名が正しいことを確認できます。このファイルは、ほとんどのLinuxシステムに存在し、一般的なサービスと対応するポート番号が含まれています。
GetServbyName()は、システム内の/etc /サービスファイルに依存して、サービス名とポート番号を照会します。ファイルが存在しない、または破損している場合、関数は結果を正しく返すことができません。
/etc /servicesファイルが存在し、破損していないかどうかを確認してください。ファイルが失われたりアクセスできない場合は、回復する必要があります。関連するオペレーティングシステムコンポーネントを再インストールすることで修正できます。
管理者である場合は、ファイル許可が正しく設定されていることを確認してください。PHPスクリプトはファイルにアクセスできます。
getServbyName()のクエリは、サービスが/etc /servicesファイルに登録されているかどうかによって異なります。サービスがシステムのサービスリストに登録されていない場合、機能は有効な結果を返すことができません。
クエリしようとしているサービスが /etc /サービスにリストされていない場合は、サービスとそのポート番号を手動で追加することを検討してください。
たとえば、 /etc /servicesファイルを開き、次のようなものを追加します。
<span><span>customservice 12345/tcp
</span></span>
このようにして、 Customserviceという名前のサービスはポート12345として登録されています。
GetServbyName()は、サービス名とプロトコルタイプの2つのパラメーターを渡す必要があります。プロトコルタイプは通常、 TCPまたはUDPです。プロトコルタイプが無効な場合、関数はnull値も返します。
プロトコルタイプが正しく、サービスがクエリ化されていることと互換性があることを確認してください。一般的なプロトコルタイプには、 TCPとUDPが含まれます。わからない場合は、ドキュメントを参照したり、システムの構成を表示したりできます。
PHPの構成の問題により、 getServbyname()が/etc /servicesファイルを正しく読み取らないようにする場合があります。たとえば、PHPの構成にはGetServbyName()機能を無効にしている可能性があります。または、システム環境に例外があります。
PHP.ini構成ファイルを確認して、関連するネットワーク関数( getServbyName()など)が無効になっていることを確認してください。
PHPが配置されている環境がシステムのネットワーク構成ファイルにアクセスできることを確認してください。
PHPINFO()関数を使用して、PHP環境が関連する拡張機能を正常にロードするかどうかを確認します。
PHPがいくつかの特別なネットワーク環境(コンテナ化された環境、仮想マシン、制限付きネットワークアクセス環境など)で実行されている場合、 GetServbyName()がシステムのサービスリストに正常にアクセスできず、null値を返すことができない場合があります。
制限された環境では、ポート番号の手動での構成など、他の方法でサービスのポート番号を取得するか、他のメソッドを使用してサービスの情報を照会してみてください。
getaddrinfo()を使用したり、既知のポート番号を直接クエリするなど、 getServbyname()の代わりにポートを直接クエリすることもできます。
GetServbyName()関数が問題を解決できなかった場合、他のPHP関数を使用するか、既知のポート番号を直接クエリすることを検討できます。たとえば、 getaddrinfo()は、ホストアドレスとポート情報を取得するのに適したより一般的な関数です。
特に/etc /servicesにアクセスできない場合、 getServbyName()の代わりにgetAddrinfo()またはその他のネットワーク関連関数を使用することを検討してください。
gettingservbyname()が空の値を返す場合、一般的な理由にはスペリングエラー、システム構成の問題、またはサービスの登録がありません。上記の診断手順とソリューションを通じて、問題を効果的にトラブルシューティングして解決できます。サービス名とプロトコルタイプの正確性を常に確認し、システム構成ファイルの整合性を確認して、機能が正常に機能することを確認してください。