IT.COM

A Whois class (sort of)

NameSilo
Watch
Impact
62
This isn't actually a whois class, it's a class that selects a whois server for a domain. If multiple whois servers are available, it chooses a random one.
The script uses this XML file to get the servers (human-readable version here).
As per their request, by default the class keeps a local cache of the XML file and updates once a day. To enable caching, make the directory the cache will be in writable. To disable caching change
PHP:
var $use_cache = true;
To
PHP:
var $use_cache = false;

Here is the class
PHP:
class whoisserver{

    var $url = "http://serverlist.domaininformation.de/";
    var $cache = "whois.xml";
    var $use_cache = true;

    function parsexml($file){
        $parser = xml_parser_create('');
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($parser, file_get_contents($file), $tags);
        xml_parser_free($parser);
    
        $elements = array();
        $stack = array();
        foreach($tags as $tag){
            $index = count($elements);
            if($tag['type'] == "complete" || $tag['type'] == "open"){
                $elements[$index] = array();
                $elements[$index]['name'] = $tag['tag'];
                $elements[$index]['attributes'] = empty($tag['attributes']) ? "" : $tag['attributes'];
                $elements[$index]['content']    = empty($tag['value']) ? "" : $tag['value'];
            
                if($tag['type'] == "open"){    # push
                    $elements[$index]['children'] = array();
                    $stack[count($stack)] = &$elements;
                    $elements = &$elements[$index]['children'];
                }
            }
        
            if($tag['type'] == "close"){    # pop
                $elements = &$stack[count($stack) - 1];
                unset($stack[count($stack) - 1]);
            }
        }
        return $elements[0];
    }

    function cachecheck(){
        if(!file_exists($this->cache) || filemtime($this->cache) < time() - 86400 && $this->use_cache == true){
            $xml = file_get_contents($this->url);
            
            unlink($this->cache);
            
            $fp = fopen($this->cache, "w+");
            fwrite($fp, $xml);
            fclose($fp);
            
            return true;
        }else{
            return false;
        }
    }

    function getxml(){
        $file = ($this->use_cache == true) ? $this->cache : $this->url;
        $xml = $this->parsexml($file);
        
        return $xml;
    }
    
    function getservers(){
        $xml = $this->getxml();
        $servers = array();

        foreach($xml['children'] as $child){
            if(!empty($child['children'])){
                foreach($child['children'] as $baby){
                    if($baby['name'] == 'domain'){
                        if(empty($servers["{$baby['attributes']['name']}"])){
                            $servers["{$baby['attributes']['name']}"] = array("{$child['attributes']['host']}");
                        }else{
                            $servers["{$baby['attributes']['name']}"][] = "{$child['attributes']['host']}";
                        }
                    }
                }
            }
        }
        
        return $servers;
    }
    
    function pickserver($tld){
        $servers = $this->getservers();
        
        if(!empty($servers["{$tld}"])){
            $server = $servers["{$tld}"];
            if(count($server) != 1){
                return $server[array_rand($server)];
            }else{
                return $server[0];
            }
        }else{
            return false;
        }
    }
    
    function go($domain){
        $this->cachecheck();
        
        $domain = str_replace('www.', '', $domain);
        $domain = strrev($domain);
        $domain = explode('.', $domain);
        
        if(count($domain) == 3){
            $tld = strrev($domain[1]) . '.' . strrev($domain[0]);
        }else{
            $tld = strrev($domain[0]);
        }
        
        $server = $this->pickserver($tld);
        return $server;
    }
}

I wrote the whole class except the parsexml() function which I found on php.net. Do what you want with the code.

Here are two examples:
PHP:
$ws = new whoisserver;
echo $ws->go("http://www.yarrt.com")."\n"; // should return "whois.crsnic.net"
echo $ws->go("http://hello.uyp")."\n"; // should return false
 
1
•••
The views expressed on this page by users and staff are their own, not those of NamePros.
Very nice class Mikor, could come in very handy. I may have to use that in the Web 2.0 Whois checker i'm working on. (Don't worry, i'll credit you. :D)
Can't rep you, apparently i'm too fond of you :o
 
0
•••
Providing http://serverlist.domaininformation.de/ is kept up to date that could come in very handy.

1 addition that might be useful however is to store the file locally and only retrieve it say once a day instead of every time the class is used.
 
0
•••
peter@flexiwebhost said:
1 addition that might be useful however is to store the file locally and only retrieve it say once a day instead of every time the class is used.
It does, have another look at the code.
 
0
•••
Next time I demand you forget that so I don't look silly when I make the suggestion :red:

Ooh and read your pm. Sorry I forgot I will read the post in a minute and get back to you :).
 
0
•••
peter@flexiwebhost said:
Next time I demand you forget that so I don't look silly when I make the suggestion :red:
Forget what? My mind is suddenly blank :hehe:

peter@flexiwebhost said:
Ooh and read your pm. Sorry I forgot I will read the post in a minute and get back to you :).
Good, and if you're likely to forget again, you may find it easier to remember if you open it in another tab - it's very difficult to forget things that are staring you in the face.
 
0
•••
  • The sidebar remains visible by scrolling at a speed relative to the page’s height.
Back