gethostbyaddr()って外部と通信するんだね


【 概要 】

PHPのあるシステムで、なぜかブラウザ表示が

重くなる現象が起きていました。

調査で、linux の netstat コマンドで見ると、

53番ポートへの通信が大量に発生していました。

は? と思い、いろいろ調べたところ、

gethostbyaddr() が原因だと突き止めました。


【 原因 】

最初に言っておきますが、

gethostbyaddr() に罪はありません。

コールの仕方に問題があったのです。

PHPのソースで、下手な書き方をしていて、

無駄に(大量に)ループしていたところがありました。

そのループ内で gethostbyaddr() をコールしていたため、

サーバからDNSの問い合わせを大量にしていたのです。

コールの回数を少なくする修正をしたところ、

サーバ(ネットワーク)の負荷が減り、

ブラウザ表示が軽くなりました。


【 そもそも 】

gethostbyaddr() って外部と通信するの?

と思われたでしょうが、言われてみれば、

IPアドレスからホスト名を取得するのだから、

DNSの逆引きをしてるんじゃ? と想像できます。

(本当は gethostbyaddr() 自体のソースを見るべきですが、

そんなスキルは無いですし、すみませんが、皆さまに おまかせします。)

例えばこれが mb_send_mail() だったら、メールを送るわけだし、

ループしたらまずいな、と考えるでしょう。

でも gethostbyaddr() が裏で通信しているなんて、

なかなか気付きません。単なる変換関数くらいに思うでしょう。

(サーバやインフラに疎い(うとい)人なら なおさらです。)


【 まとめ 】

PHPソースの修正前は、通信先のネームサーバに

Dos攻撃をしていたようなものです。

(申し訳なかったです。)

gethostbyaddr() をコールする回数もそうですが、

同じIPアドレスで しつこく何回もコールしないよう、

結果をキャッシュする工夫も必要と思います。

あ でも、ふつうに使う分には問題ありませんよ。

信じられないくらいループしていたから

ネットワーク負荷が高くなっただけです。