php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #40427 fsockopen() always forces a DNS resolution unnecessarily
Submitted: 2007-02-10 02:33 UTC Modified: 2007-02-10 19:51 UTC
From: andrew at neonsurge dot com Assigned:
Status: Not a bug Package: Streams related
PHP Version: 5.2.1 OS: Gentoo, OS-X 10.4
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: andrew at neonsurge dot com
New email:
PHP Version: OS:

 

 [2007-02-10 02:33 UTC] andrew at neonsurge dot com
Description:
------------
fsockopen() always asks your DNS server for the IP address 
of a connection before it opens it, instead of trying to 
look in the local cache first.  I believe this is unexpected 
and performance-wise is a very undesirable operation.  See 
reproduce code...

Reproduce code:
---------------
<?php for ($i = 0; $i < 50; $i++) {
	$errno = $errstr = "";
	//$ip = gethostbyname("php.net");  $a = fsockopen($ip,22,$errno,$errstr,10);  //FAST way
	$a = fsockopen("php.net",22,$errno,$errstr,10); //SLOW way
	$ab = fread($a,4096); unset($a, $ab);
} ?>

Expected result:
----------------
While running the slower code above exactly as 
is, you can packet sniff and view 50 full requests for the 
domain php.net.  This is unoptimized and causes this code to 
run extremely slow.

When running with the fast way (change lines commented out) 
the above code runs a few hundred percent faster.  Upon a 
packet sniff you can watch 1 or two requests for php.net 
being sent to your DNS server which I believe is the desired 
result.

NOTE: In the code above I do have the workaround by 
connecting with the IP instead by using gethostbyname() 
first which appears to use the local DNS cache.

Actual result:
--------------
The code above should run exactly the same speed either way.  
fsockopen should be using the local machine's DNS cache and 
not have to query the DNS server upon every request when 
given a DNS name to connect to.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-02-10 19:51 UTC] tony2001@php.net
>fsockopen() always asks your DNS server for the IP address 
>of a connection before it opens it, instead of trying to 
>look in the local cache first. 

Believe me, fsockopen() knows nothing about DNS servers and local caches.
Not PHP problem.
 [2011-10-11 06:26 UTC] georg dot hoellrigl at xidras dot com
Just for completness: The problem still existis in newer PHP Versions even if it may come from the used system calls.

There is a simple solution to this: Disable IPv6 and try again...
 
PHP Copyright © 2001-2017 The PHP Group
All rights reserved.
Last updated: Sun Nov 19 01:31:42 2017 UTC