Here's one I've written a while ago using a simple trick (without listing out all the whois servers). I converted it from Perl, and it's also in C# and a COM object too.
It doesn't do all whois lookups as some of the domain registars are greedy *&!$ and want you to pay for the lookup, or keep it private. There's details about it on the page.
Update
Here's the code to save you downloading. I wrote it using PHP 3.x so some massaging for PHP5 might be needed:
class Whois
{
    /*
     * Optional parameter for the server to be used for the lookup.
     * If this is not set, an appropriate whois server for the domain name
     * specified is automagically found by the Whois class. 
     * @type string
     * @access public
     */
    var $whois_server;
    /*
     * The timeout, in seconds, for the lookup. Default is 30. 
     * @type integer
     * @access public
     */
    var $timeout = 30;
    /*
     * Returns a string, with new-lines (\n) converted to non-breaking spaces (<BR>),
     * with details for the domain specified by $domain. 
     * @access public
     * @param string $domain the domain to lookup, excluding http:// and www
     * @return string the results of the whois
     */
    function lookup($domain)
    {
     $result = "";
     $parts  = array();
     $host   = "";
     // .tv don't allow access to their whois
     if (strstr($domain,".tv"))
     {
      $result = "'.tv' domain names require you to have an account to do whois searches.";
     // New domains fix (half work, half don't)
     } elseif (strstr($domain,".name") || strstr($domain,".pro") >0){
      $result = ".name,.pro require you to have an account to do whois searches.";
     } else{
      if (empty($this->whois_server))
      {
       $parts    = explode(".",$domain);
       $testhost = $parts[sizeof($parts)-1];
       $whoisserver   = $testhost . ".whois-servers.net";
       $this->host     = gethostbyname($whoisserver);
       $this->host     = gethostbyaddr($this->host);
       if ($this->host == $testhost)
       {
        $this->host = "whois.internic.net";
       }
       flush();
      }
      $whoisSocket = fsockopen($this->host,43, $errno, $errstr, $this->timeout);
      if ($whoisSocket)
      {
       fputs($whoisSocket, $domain."\015\012");
       while (!feof($whoisSocket))
       {
        $result .= fgets($whoisSocket,128) . "<br>";
       }
       fclose($whoisSocket);
      }
     }
     return $result;
    }
}
Example usage  
$whois = new Whois();
echo "<B>compaq.it</B><BR>";
echo $whois->lookup("compaq.it");
echo "<HR>";