01-14-2008, 01:29 AM
· #1 Resident Linux Geek
Name: Michael Walker
Location: East Yorkshire, England
Join Date: Aug 2005
Posts: 2,265
NP$: 283.30 (
Donate )
A whois class (sort of)
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
To
Here is the class
PHP Code:
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 Code:
$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
01-14-2008, 08:19 PM
· #2 Resistance is Futile
Name: Mitchell
Location: Calgary, Canada
Join Date: Apr 2006
Posts: 1,049
NP$: 222.05 (
Donate )
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.
)
Can't rep you, apparently i'm too fond of you
01-15-2008, 03:16 AM
· #3 NamePros Staff
Name: Peter McDonald
Location: Dundee, Scotland
Join Date: Nov 2003
Posts: 3,754
NP$: 74.70 (
Donate )
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.
01-15-2008, 04:06 AM
· #4 Resident Linux Geek
Name: Michael Walker
Location: East Yorkshire, England
Join Date: Aug 2005
Posts: 2,265
NP$: 283.30 (
Donate )
Originally Posted by peter@flexiwebhost 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.
01-15-2008, 04:15 AM
· #5 NamePros Staff
Name: Peter McDonald
Location: Dundee, Scotland
Join Date: Nov 2003
Posts: 3,754
NP$: 74.70 (
Donate )
Next time I demand you forget that so I don't look silly when I make the suggestion
Ooh and read your pm. Sorry I forgot I will read the post in a minute and get back to you
.
01-15-2008, 04:46 AM
· #6 Resident Linux Geek
Name: Michael Walker
Location: East Yorkshire, England
Join Date: Aug 2005
Posts: 2,265
NP$: 283.30 (
Donate )
Originally Posted by peter@flexiwebhost Next time I demand you forget that so I don't look silly when I make the suggestion
Forget what? My mind is suddenly blank
Originally Posted by peter@flexiwebhost 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.
Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off