1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

#【 概要 】

PHPのあるシステムで、なぜかブラウザ表示が
重くなる現象が起きていました。

調査で、linux の netstat コマンドで見ると、
53番ポートへの通信が大量に発生していました。

は? と思い、いろいろ調べたところ、
gethostbyaddr() が原因だと突き止めました。

#【 原因 】

最初に言っておきますが、
gethostbyaddr() に罪はありません。
コールの仕方に問題があったのです。

PHPのソースで、下手な書き方をしていて、
無駄に(大量に)ループしていたところがありました。

そのループ内で gethostbyaddr() をコールしていたため、
サーバからDNSの問い合わせを大量にしていたのです。

コールの回数を少なくする修正をしたところ、
サーバ(ネットワーク)の負荷が減り、
ブラウザ表示が軽くなりました。

#【 そもそも 】

gethostbyaddr() って外部と通信するの?
と思われたでしょうが、言われてみれば、
IPアドレスからホスト名を取得するのだから、
DNSの逆引きをしてるんじゃ? と想像できます。

(本当は gethostbyaddr() 自体のソースを見るべきですが、
そんなスキルは無いですし、すみませんが、皆さまに おまかせします。)

例えばこれが mb_send_mail() だったら、メールを送るわけだし、
ループしたらまずいな、と考えるでしょう。

でも gethostbyaddr() が裏で通信しているなんて、
なかなか気付きません。単なる変換関数くらいに思うでしょう。
(サーバやインフラに疎い(うとい)人なら なおさらです。)

#【 まとめ 】

PHPソースの修正前は、通信先のネームサーバに
Dos攻撃をしていたようなものです。
(申し訳なかったです。)

gethostbyaddr() をコールする回数もそうですが、
同じIPアドレスで しつこく何回もコールしないよう、
結果をキャッシュする工夫も必要と思います。

あ でも、ふつうに使う分には問題ありませんよ。
信じられないくらいループしていたから
ネットワーク負荷が高くなっただけです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?