#【 概要 】
PHPのあるシステムで、なぜかブラウザ表示が
重くなる現象が起きていました。
調査で、linux の netstat コマンドで見ると、
53番ポートへの通信が大量に発生していました。
は? と思い、いろいろ調べたところ、
gethostbyaddr() が原因だと突き止めました。
#【 原因 】
最初に言っておきますが、
gethostbyaddr() に罪はありません。
コールの仕方に問題があったのです。
PHPのソースで、下手な書き方をしていて、
無駄に(大量に)ループしていたところがありました。
そのループ内で gethostbyaddr() をコールしていたため、
サーバからDNSの問い合わせを大量にしていたのです。
コールの回数を少なくする修正をしたところ、
サーバ(ネットワーク)の負荷が減り、
ブラウザ表示が軽くなりました。
#【 そもそも 】
gethostbyaddr() って外部と通信するの?
と思われたでしょうが、言われてみれば、
IPアドレスからホスト名を取得するのだから、
DNSの逆引きをしてるんじゃ? と想像できます。
(本当は gethostbyaddr() 自体のソースを見るべきですが、
そんなスキルは無いですし、すみませんが、皆さまに おまかせします。)
例えばこれが mb_send_mail() だったら、メールを送るわけだし、
ループしたらまずいな、と考えるでしょう。
でも gethostbyaddr() が裏で通信しているなんて、
なかなか気付きません。単なる変換関数くらいに思うでしょう。
(サーバやインフラに疎い(うとい)人なら なおさらです。)
#【 まとめ 】
PHPソースの修正前は、通信先のネームサーバに
Dos攻撃をしていたようなものです。
(申し訳なかったです。)
gethostbyaddr() をコールする回数もそうですが、
同じIPアドレスで しつこく何回もコールしないよう、
結果をキャッシュする工夫も必要と思います。
あ でも、ふつうに使う分には問題ありませんよ。
信じられないくらいループしていたから
ネットワーク負荷が高くなっただけです。